Пожалуйста, обратитесь к следующей ссылке, поскольку я пытался упростить проблему, с которой я столкнулся, и теперь столкнулся с проблемой, которую не могу решить.
Ссылка: Qt: Как использовать QTimer для печатисообщение для QTextBrowser каждые 10 секунд?
В публикации по приведенной выше ссылке я упростил задачу, которую я пытаюсь сделать, просто сказав, что я хочу нажать кнопку и заставить ее что-то отображать вQTextBrowser
каждые 10 секунд.У меня были проблемы с тем, чтобы QTimer
работал в то время, поэтому я подумал, что, если я смогу заставить QTimer
работать, я мог бы закончить свою задачу.
Что я действительно пытаюсь сделать, это прочитать строки изфайл и после каждых 2500 строк я хотел бы напечатать сообщение и затем подождать 10 секунд.
Псевдокод:
while(not at the end of the file)
{
read in 2500 lines
print a message
wait 10 seconds
}
QTimer
это хорошо, но это противоположно тому, что я хочусделать.Вместо того, чтобы передавать сообщение и ждать 10 секунд, сначала они ждут 10 секунд, тайм-аут, а затем отправляют сообщение.
Итак, чтобы заставить его работать так, как я хочу, я сначала позвонил в printMessage()
SLOT, а затем ясделал слот под названием stopTimer()
, который просто останавливает таймер.Поэтому по истечении 10 секунд он просто вызовет stopTimer () и затем продолжит обработку входного файла.
В отношении проблемы REAL:
Qt не ожидает завершения QTimer
прежде чем он движется по коду.Я хочу, чтобы код ожидал полных 10 секунд, прежде чем он прочитает следующие 2500 строк кода.Я обнаружил, что QTimer
имеет функцию isActive()
, которая возвращает значение bool.
Поэтому в то место, где я хотел, чтобы 10-секундная задержка закончилась, я поставил следующее:
while(timer->isActive());
Я полагал, что программа будет оставаться в этом цикле в течение 10 секунд, а затем выйдет послеQTimer
истекло время ожидания, потому что тогда условие будет ложным.Проблема в том, что он не выходит из цикла, потому что состояние таймера никогда не меняется независимо от того, как долго он ожидает в этом цикле!Я проверил с помощью отладчика, и isActive( )
остается верным независимо от истекшего времени.
Затем я пропустил цикл while(timer->isActive())
и наблюдал таймер в отладчике.Кажется, что таймер фактически не начинает отсчет времени, пока он не завершит какое-то время (не в конце файла).Поэтому я считаю, что поскольку цикл while(timer->isActive())
вложен в него, он никогда не прерывается.Я могу ошибаться, но похоже, что это происходит.Кроме того, раздражает то, что у объекта QTimer
нет поля, которое показывает истекшее время таймера, когда он активен.Поэтому я не могу проверить истекшее время для дальнейшей отладки.
Кто-то, пожалуйста, проверьте это или сообщите мне обходной путь для этого!
Для чего-то, что звучит так просто, это былосамая большая боль, которую я испытывал в последнее время, но я обычно не использую Qt, так что это может быть моим недостатком опыта.
Вот выдержка из кода, который у меня есть, который в настоящее время зависает, как указано выше:
void Form::startBtn_pushed()
{
QTimer *timer = new QTimer(this);
QFile file(“file.txt”);
QTextStream stream(&file);
QString line;
int lineCount = 0;
connect(timer, SIGNAL(timeout()), this, SLOT(stopTimer()));
while(!(stream.atEnd())
{
line = stream.readLine();
lineCount++;
if(lineCount == 2500)
{
printMessage();
timer->start(10000);
while(timer->isActive()); //Wait for timer to timeout before continuing
}
}
}
Извините за длинный пост, и если бы я мог допустить грамматические ошибки с моим кодом здесь.У меня нет доступа в интернет на моей машине разработчика, поэтому мне пришлось перепечатать это здесь.