Russian Qt Forum
Ноябрь 23, 2024, 07:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: GUI поток и воркер, в котором запущен while(true)-умрут ли слоты?  (Прочитано 16973 раз)
crashtua
Гость
« Ответ #30 : Август 24, 2012, 18:44 »

Хм, посмотрел исходники той проги, там цикл вот такой:
Код
C++ (Qt)
while( 1 )
{
// block for 50ms on all sockets - if you intend to perform any timed actions more frequently you should change this
// that said it's likely we'll loop more often than this due to there being data waiting on one of the sockets but there aren't any guarantees
 
if( gGHost->Update( 50000 ) )
break;
}
 
50000 - таймаут для функции http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx. + до того таймаута там выполняется еще куча всяких непонятных радостей... Теперь вопрос: можно ли сделать таймер так, что бы он не посылал новый сигнал до того, как завершится старый, и при этом что бы не блокировался GUI поток(мне бы стоило почитать доки про таймер, но как то жутко лень, и так сегодня начитался и доков, и сорцов...)?
Записан
andrew.k
Гость
« Ответ #31 : Август 24, 2012, 18:45 »

А вариант с таймером почти подходит, но там сокеты... Хотелось бы моментального отклика, а не по таймеру...
Я думаю, что лучше тебе сделать так.
Пишешь некоторый класс (ProblemSolver), вообще не думая о потоках, который делает всю эту работу, которая у тебя запихана в твой цикл.
Это будет проще и кошернее.
Затем создаешь два объекта QThread (оригинальный без всякого наследования) и свой класс ProblemSolver.
и делаешь ему moveToThread.
Код
C++ (Qt)
solver = new ProblemSolver();
thread = new QThread(this);
solver->moveToThread(thread);
thread->start();
solver->startSolving();
как-то так. И будет оно работать как надо.
« Последнее редактирование: Август 24, 2012, 18:49 от andrew.k » Записан
andrew.k
Гость
« Ответ #32 : Август 24, 2012, 18:48 »

Хм, посмотрел исходники той проги, там цикл вот такой:
Код
C++ (Qt)
while( 1 )
{
// block for 50ms on all sockets - if you intend to perform any timed actions more frequently you should change this
// that said it's likely we'll loop more often than this due to there being data waiting on one of the sockets but there aren't any guarantees
 
if( gGHost->Update( 50000 ) )
break;
}
 
50000 - таймаут для функции http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx. + до того таймаута там выполняется еще куча всяких непонятных радостей... Теперь вопрос: можно ли сделать таймер так, что бы он не посылал новый сигнал до того, как завершится старый, и при этом что бы не блокировался GUI поток(мне бы стоило почитать доки про таймер, но как то жутко лень, и так сегодня начитался и доков, и сорцов...)?
Ты можешь просто игнорировать сигнал от таймера, если он тебе не нужен.
Записан
crashtua
Гость
« Ответ #33 : Август 24, 2012, 19:06 »

А вариант с таймером почти подходит, но там сокеты... Хотелось бы моментального отклика, а не по таймеру...
Я думаю, что лучше тебе сделать так.
Пишешь некоторый класс (ProblemSolver), вообще не думая о потоках, который делает всю эту работу, которая у тебя запихана в твой цикл.
Это будет проще и кошернее.
Затем создаешь два объекта QThread (оригинальный без всякого наследования) и свой класс ProblemSolver.
и делаешь ему moveToThread.
Код
C++ (Qt)
solver = new ProblemSolver();
thread = new QThread(this);
solver->moveToThread(thread);
thread->start();
solver->startSolving();
как-то так. И будет оно работать как надо.
А как же оно будет работать, если мы муванем ProblemSolver и вызовем там цикл, наш thread повиснет же...
Записан
andrew.k
Гость
« Ответ #34 : Август 24, 2012, 19:08 »

А вариант с таймером почти подходит, но там сокеты... Хотелось бы моментального отклика, а не по таймеру...
Я думаю, что лучше тебе сделать так.
Пишешь некоторый класс (ProblemSolver), вообще не думая о потоках, который делает всю эту работу, которая у тебя запихана в твой цикл.
Это будет проще и кошернее.
Затем создаешь два объекта QThread (оригинальный без всякого наследования) и свой класс ProblemSolver.
и делаешь ему moveToThread.
Код
C++ (Qt)
solver = new ProblemSolver();
thread = new QThread(this);
solver->moveToThread(thread);
thread->start();
solver->startSolving();
как-то так. И будет оно работать как надо.
А как же оно будет работать, если мы муванем ProblemSolver и вызовем там цикл, наш thread повиснет же...
Что значит повиснет? Зависание это неконтролируемый бесконечный цикл, а если он контролируемый, то это не зависание, а "длительные вычисления" Улыбающийся
Он просто будет кушать процессор и твоя забота, чтобы он его кушал не в холостую)
По завершению из цикла нужно выйти и можно остановить поток, а можно и не останавливать.
Записан
crashtua
Гость
« Ответ #35 : Август 24, 2012, 20:26 »

Принял решение остановится на следующем варианте: класс Worker имеет слот, в котором содержится тело цикла while(true), в этом же классе(Worker) создается таймер с интервалом 50 мс. Создается поток, в него мувается мой Worker. Работает, тело цикла запускается с нужной периодичностью, слоты запускаются с созданого потока, GUI и Worker не оказывают негативного влияния один на другого. Всем спасибо за внимание, очень помогли.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.187 секунд. Запросов: 21.