Hi,
first of all, sorry for my bad English.
Now the question.
I've written a class inherited from QThread
// DataSender.cpp
{
this->m_sendTimer.setInterval (0);
connect (&m_sendTimer, SIGNAL(timeout()), this, SLOT(sendData()));
}
void DataSender::setSendInterval (int msec)
{
this->m_sendTimer.setInterval (msec);
}
void DataSender::run ()
{
bool ans = true;
qDebug ("%s Started", qPrintable(this->objectName ()));
if (ans && this->m_sendTimer.interval () > 0) {
this->m_sendTimer.start ();
qDebug ("%s: Timer Started", qPrintable(this->objectName ()));
}
if (ans) {
this->exec ();
}
this->m_sendTimer.stop ();
qDebug ("%s Stopped", qPrintable(this->objectName ()));
}
// DataSender.cpp
DataSender::DataSender(QObject *parent) : QThread(parent)
{
this->m_sendTimer.setInterval (0);
connect (&m_sendTimer, SIGNAL(timeout()), this, SLOT(sendData()));
}
void DataSender::setSendInterval (int msec)
{
this->m_sendTimer.setInterval (msec);
}
void DataSender::run ()
{
bool ans = true;
qDebug ("%s Started", qPrintable(this->objectName ()));
if (ans && this->m_sendTimer.interval () > 0) {
this->m_sendTimer.start ();
qDebug ("%s: Timer Started", qPrintable(this->objectName ()));
}
if (ans) {
this->exec ();
}
this->m_sendTimer.stop ();
qDebug ("%s Stopped", qPrintable(this->objectName ()));
}
To copy to clipboard, switch view to plain text mode
This class is in a library.
When I use it in a GUI Application it works
void MainWindow::startSenders ()
{
DataSender* s = 0;
for (int i = 0; i < DATA_TYPE_SIZE; ++i) {
s = &this->m_senders[i];
s->setSendInterval (10000);
s->sender->start ();
}
qDebug ("Senders Started");
}
void MainWindow::startSenders ()
{
DataSender* s = 0;
for (int i = 0; i < DATA_TYPE_SIZE; ++i) {
s = &this->m_senders[i];
s->setSendInterval (10000);
s->sender->start ();
}
qDebug ("Senders Started");
}
To copy to clipboard, switch view to plain text mode
but when I use it in a non-GUI application
// Main.cpp
...
DataSender* senders[2];
senders[0] = new DataSender;
senders[0]->setSendInterval(1000);
senders[1] = new DataSender;
senders[1]->setSendInterval(5000);
qDebug ("RUNNING...");
for (int i = 0; i < 2; ++i) {
senders[i]->start ();
}
result = app.exec ();
...
// Main.cpp
...
DataSender* senders[2];
senders[0] = new DataSender;
senders[0]->setSendInterval(1000);
senders[1] = new DataSender;
senders[1]->setSendInterval(5000);
qDebug ("RUNNING...");
for (int i = 0; i < 2; ++i) {
senders[i]->start ();
}
result = app.exec ();
...
To copy to clipboard, switch view to plain text mode
the slot connected to the timeout() signal of timer is never called.
The debug messages in DataSender.cpp at line 19 and 23 are printed; that means the thread is correctly started.
Any suggestion?
Bookmarks