crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Как ждать завершения потока?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 14.3.2010, 2:49
 
Цитата(mezmay @ 14.3.2010, 2:16) *
так и должно быть??
да, тыж сидишь и ждёшь когда поток закончится, не обрабатываешь других событий
mezmay Дата 13.3.2010, 23:16
  Еще один вопрос - почему строки

gps_thread->start();
gps_thread->wait();


вешают GUI поток? т.е. форма висит пока вэит не закончится, а если оставить только

gps_thread->start();


то нормально работает? так и должно быть??
mezmay Дата 13.3.2010, 22:21
  хз...... дома запустил тоже самое (но с виртуальным портом) - работает...
Litkevich Yuriy Дата 13.3.2010, 18:36
  закоментируй строчку:
Цитата(mezmay @ 13.3.2010, 21:10) *
set = true;
ради теста
mezmay Дата 13.3.2010, 18:10
  Тогда помогите разобраться... Программа для чтения данных с GPS-устройства по COM-порту. Метод run() в котором собственно это и делается:

class GPSthread : public QThread


void GPSthread::run()
{
    if(isOpen)    
    {
        bool set = false;
        QTime time;
        time.start();        
        
        // Запрос данных
        QByteArray barray;
        QDataStream stream(&barray, QIODevice::WriteOnly);
        stream << (byte)begin;
        stream << (byte)0x25;    
        stream << (byte)1;
        stream << (byte)begin;
        stream << (byte)end;
        port->write(barray);

        while(!set && time.elapsed() < 10000)
        {
            
            port->waitForReadyRead(500);
            int nba = port->bytesAvailable();
            if(nba > 20)
            {
                int tm = time.elapsed();
                port->read((char *)&data[0], nba);
                if(data[0] == begin && data[1] == ticksID && data[19] == begin && data[20] == end)
                {
                    
                    quint64 *val64 = (quint64 *)&data[2];    //8 bytes value
                    quint64 mask64 = ~(((quint64)1) << 63);
                    quint64 f = (quint64)((quint64)(*val64) & (quint64)mask64);

                    quint16 *val16 = (quint16 *)&data[10];
                    quint16 mask16 = ~(((quint16)1) << 15);
                    quint16 e = (quint16)(((quint16)(*val16)) & ((quint16)mask16));

                    quint8 s = data[11] >> 7;    

                    // Определение числа миллисекунд
                    double v = 0;

                    if(e > 0)
                    {
                        if(e < 32767)
                        {
                            v = pow((double)2, (double)(e - 16383)) * (1 + ((double)f) / pow((double)2, double(63)));                
                        }
                    }
                    if( e == 0)
                    {
                        if( f == 0)
                            v = 0;
                        else    // f <> 0
                            v = 0;
                    }
                    if( e == 32767)
                    {
                        if( f == 0)
                            v = DBL_MIN;
                    }
                    /*SYSTEMTIME *sys_time = new SYSTEMTIME;
                    GetSystemTime(sys_time);                    

                    stime gps_time = getTimeStruct(v, 0);                    
                    SYSTEMTIME now_sys_time;
                    now_sys_time = *sys_time;
                    now_sys_time.wHour = gps_time.h;
                    now_sys_time.wMinute = gps_time.m;
                    now_sys_time.wSecond = gps_time.s;
                    now_sys_time.wMilliseconds = gps_time.msec;

                    set = true;
                    SetSystemTime(&now_sys_time);
                    emit showWidget();
                    delete sys_time;*/

                    int numb = tm/1000;                    
                    now_time = getDayMsecs(v) - 1000*numb;
                    set = true;
                    emit sync(now_time);
                }
            }
        }
    }    

    emit canDelete();
}


Вызов метода:
gps_thread->start();
gps_thread->wait();


Проблема: если устройства нет, то цикл while в run() - длится 10 секунд. Однако если после вызова gps_thread->start() стоит вызов gps_thread->wait(), то сразу срабатывает брейкпоинт на последней строке run'a - строке emit canDelete();... - почему?? Если gps_thread->wait(); убрать, то цикл while работает 10 секунд как ему и положено...
Litkevich Yuriy Дата 13.3.2010, 15:57
 
Цитата(mezmay @ 13.3.2010, 18:42) *
но этот метод просто завершает run()
где ты такое прочитал?
mezmay Дата 13.3.2010, 15:42
  но этот метод просто завершает run() а не ждет его завершения...
DEADHUNT Дата 13.3.2010, 14:19
 
bool QThread::wait ( unsigned long time = ULONG_MAX )
mezmay Дата 13.3.2010, 14:14
  Наследую qthread. переопределяю метод run. В программе запускаю поток с помощью start. Как в том же месте программы подождать завершения этого потока?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 17:59