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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Выполнение метода класса в новом потоке.  (Прочитано 15838 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #15 : Апрель 09, 2014, 19:10 »

Да. В однопоточном консольном приложении это все отлично отрабатывает.
А после запуска execute в отдельном потоке, в главном потоке происходит работа с объектом _cpu?
Записан
rudolfninja
Гость
« Ответ #16 : Апрель 09, 2014, 19:25 »

Да. Там тяжелое взаимодействие. Собственно, из-за этого и валилась программа.
У меня эта программа (вбитая в память cpu) в бесконечном цикле читает состояние чекбокса и выводит его в QLabel.
Чекбокс "соединен" с адресом 0xfffa памяти cpu. Когда чекбокс помечен, по этому адресу пишется единица, когда не помечен - ноль.
Аналогичным образом label "соединен" по адресу 0xfffb. Программа из памяти процессора в бесконечном цикле читает то, что по адресу 0xfffa  и кидает по адресу 0xfffb. QLabel динамически создан в cpu и отображен на форме. При записи по адресу 0xfffb этот QLabel обновляется и изменение должно отобразиться на форме.
Вот на моменте, когда я пытаюсь изменить этот label программа и валиться
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Апрель 09, 2014, 19:29 »

Вот на моменте, когда я пытаюсь изменить этот label программа и валиться
Ну так нельзя работать с GUI из другого потока. Или работайте в главном потоке или развязывайте взаимодействие через очередь событий, например, сигналами.
Записан
rudolfninja
Гость
« Ответ #18 : Апрель 09, 2014, 19:56 »

Ребят, всем спасибо. Вроде разобрался.
Теперь вопрос, как убить выполнение этой функции?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #19 : Апрель 09, 2014, 20:00 »

Теперь вопрос, как убить выполнение этой функции?
Как всегда. Улыбающийся
Добавьте в вашу функцию проверку некоего флага и при его изменении выходите из функции.
Записан
rudolfninja
Гость
« Ответ #20 : Апрель 09, 2014, 21:27 »

QtConcurrent::run возвращает объект QFuture, у него есть метод cancel, который, вроде как, убивает поток, в котором выполняется этот метод. Его можно использовать, чтоб убить функцию или только флажком каким-нибудь?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Апрель 09, 2014, 21:29 »

QtConcurrent::run возвращает объект QFuture, у него есть метод cancel, который, вроде как, убивает поток, в котором выполняется этот метод. Его можно использовать, чтоб убить функцию или только флажком каким-нибудь?
Убивать нитки чревато, лучше их завершать.
Записан
rudolfninja
Гость
« Ответ #22 : Апрель 09, 2014, 21:43 »

Так а как завершить, если программа в процессоре работает в бесконечном цикле? И флаг тоже никакой нельзя проверить, так как программа (выполняемая cpu) пишется пользователем и заставлять его делать проверку флажка по какому-то адресу - не вариант совсем.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #23 : Апрель 09, 2014, 21:48 »

Так а как завершить, если программа в процессоре работает в бесконечном цикле? И флаг тоже никакой нельзя проверить, так как программа (выполняемая cpu) пишется пользователем и заставлять его делать проверку флажка по какому-то адресу - не вариант совсем.
Пользователя просить не надо. Улыбающийся
Вот на примере вашего кода:
Код
C++ (Qt)
void intel8086::execute()
{
   while( _running && _registers[IP] < _stop_address){
       step();
   }
}
 
void intel8086::stop()
{
   _running = false;
}
 

Как только нужно завершить функцию execute, выполняемую в отдельном потоке, вызываете _cpu.stop()
Записан
rudolfninja
Гость
« Ответ #24 : Апрель 09, 2014, 21:50 »

Ну да, спасибо. Это, действительно, хороший вариант.
Спасибо, большое, всем, кто ответил. Проблему свою решил.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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