crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Как ждать завершения потока?
mezmay
  опции профиля:
сообщение 13.3.2010, 14:14
Сообщение #1


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

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

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




Репутация:   1  


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


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

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


bool QThread::wait ( unsigned long time = ULONG_MAX )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 13.3.2010, 15:42
Сообщение #3


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

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

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




Репутация:   1  


но этот метод просто завершает run() а не ждет его завершения...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2010, 15:57
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(mezmay @ 13.3.2010, 18:42) *
но этот метод просто завершает run()
где ты такое прочитал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 13.3.2010, 18:10
Сообщение #5


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

Группа: Участник
Сообщений: 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 секунд как ему и положено...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2010, 18:36
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


закоментируй строчку:
Цитата(mezmay @ 13.3.2010, 21:10) *
set = true;
ради теста
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 13.3.2010, 22:21
Сообщение #7


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

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

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




Репутация:   1  


хз...... дома запустил тоже самое (но с виртуальным портом) - работает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 13.3.2010, 23:16
Сообщение #8


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

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

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




Репутация:   1  


Еще один вопрос - почему строки

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


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

gps_thread->start();


то нормально работает? так и должно быть??

Сообщение отредактировал mezmay - 13.3.2010, 23:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.3.2010, 2:49
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(mezmay @ 14.3.2010, 2:16) *
так и должно быть??
да, тыж сидишь и ждёшь когда поток закончится, не обрабатываешь других событий
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 21.11.2019, 0:55