QTimer in QThread ..???
-
Hi,
If I write this :
void StepperMotor::moveR(int step) { qDebug() << this->thread()->currentThread(); QTimer t; t.setInterval(1000); int posReach = send(GAP,1,0,0) + step; send(MVP, 1, step, 0); t.start(); while (posReach != send(GAP,1,0,0,false) && t.remainingTime()>=0); qDebug() << "END "<< QTime::currentTime() << t.remainingTime(); }
Launch by a QtConcurrent, the timer "t.remainingTime() = 0 at once.
And no pause are done so if I wrote several time :
moveR(100);
moveR(-1100);
moveR(150);These 3 function are done in the same time ~3ms between 2 functions.
I don't know how wait the end of the first moveR to launch the second. (Without hanging GUI)
Someone can help me ?
thx -
I think start up a separate thread. Inside it you can emit a signal to the GUI thread which can be picked up by a slot that you create in the GUI thread. This slot can give you lots of feedback information. I emit a signal just for diagnosing code in the thread. It can be inserted anywhere in the thread code. It simply supplies a Qstring to the GUI slot . You can use csv (comma separated values) for a simple way of holding data of different types. You can show them in a Lineedit ,Textedit or even fill up combobox's , and so on.
This way you can test methods ...Also, you might even look into trying something along this pseudo code . Do loops work great in these situations.
Do
{
your code to moveR
{
while ( your condition to test end of moveR)// you don't have to worry about blocking GUI in separate thread
-
-
If i put moveR in thread my timer dosen't work
t.start(5000); do{ qDebug() << t.remainingTime(); }while (posReach != send(GAP,1,0,0,false) && t.remainingTime()>=0);
Outside thread:
Timer =
1000
1000
1000
999
999
999
999
998
998
998
997Inside thread :
Timer =
-177908879and ended the function.
In my condition while :
while (posReach != send(GAP,1,0,0,false) && t.remainingTime()>=0);
I call send function :
int StepperMotor::send(int commande, int param, int value, int motor_bank, bool verbose) { UCHAR Address, Status; int Value, Timeout; Address=0; Status=0; Value=0; Timeout=GetTickCount(); SendCmd(hRS232, 1, commande, param, motor_bank, value); while(GetResult(hRS232, &Address, &Status, &Value)==TMCL_RESULT_NOT_READY && abs(GetTickCount()-Timeout)<1000); if(Address == 0) { portIsOpen = false; emit errorPort("Envoi impossible"); if(!closeCOMmanual) tryToConnect(); return -1; } emit reponse(Value, Status, Address); if(verbose) qDebug() << QString("[%4] Result: Address=%1, Status=%2, Value=%3\n").arg(Address).arg(Status).arg(Value).arg(GetTickCount()-Timeout); return Value; } /******/ void StepperMotor::SendCmd(HANDLE Handle, UCHAR Address, UCHAR Command, UCHAR Type, UCHAR Motor, INT Value) { UCHAR TxBuffer[9]; DWORD BytesWritten; int i; TxBuffer[0]=Address; TxBuffer[1]=Command; TxBuffer[2]=Type; TxBuffer[3]=Motor; TxBuffer[4]=Value >> 24; TxBuffer[5]=Value >> 16; TxBuffer[6]=Value >> 8; TxBuffer[7]=Value & 0xff; TxBuffer[8]=0; for(i=0; i<8; i++) TxBuffer[8]+=TxBuffer[i]; //Send the datagram cptRequest++; WriteFile(Handle, TxBuffer, 9, &BytesWritten, NULL); } UCHAR StepperMotor::GetResult(HANDLE Handle, UCHAR *Address, UCHAR *Status, int *Value) { UCHAR RxBuffer[9], Checksum; DWORD Errors, BytesRead; COMSTAT ComStat; int i; //Check if enough bytes can be read ClearCommError(Handle, &Errors, &ComStat); if(ComStat.cbInQue>8) { cptRequest++; //Receive ReadFile(Handle, RxBuffer, 9, &BytesRead, NULL); Checksum=0; for(i=0; i<8; i++) Checksum+=RxBuffer[i]; if(Checksum!=RxBuffer[8]) return TMCL_RESULT_CHECKSUM_ERROR; *Address=RxBuffer[0]; *Status=RxBuffer[2]; *Value=(RxBuffer[4] << 24) | (RxBuffer[5] << 16) | (RxBuffer[6] << 8) | RxBuffer[7]; } else return TMCL_RESULT_NOT_READY; return TMCL_RESULT_OK; }
-
If i put moveR in thread my timer dosen't work
Your timer can't work when you block the event loop, since a timer relies on the event loop to dispatch the timer events.