crossplatform.ru

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

mezmay
  опции профиля:
сообщение 13.3.2010, 14:14
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Наследую qthread. переопределяю метод run. В программе запускаю поток с помощью start. Как в том же месте программы подождать завершения этого потока?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
mezmay
  опции профиля:
сообщение 13.3.2010, 18:10
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Тогда помогите разобраться... Программа для чтения данных с 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 секунд как ему и положено...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 25.6.2025, 0:34