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