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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: UI в (не) главной thread  (Прочитано 3149 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 27, 2012, 16:40 »

Добрый день

Ну конечно "работать с UI только в главной thread" - это все знают. Однако у меня (приложение не использует Qt) возникла ситуация где очень захотелось "не из главной" - иначе переделывать много. Ну думаю почему нет - ведь я могу обеспечить что одна (и только одна) нитка работает с UI. Не тут-то было. Неприятности начались на таком старом нативном коде
Код
C++ (Qt)
::SetGDevice(::GetMainDevice());
:WaitNextEvent(everyEvent, &macEvent, 0, sMouseRgn);
 
Если звать это из разных ниток, то приходит только событие движения мыши, а вот все остальное (keyDown, mouseDown) нет. Если звать только из главной - все норм.

Да, эти ф-ции помечены как "not thread-safe" и, я так понял, это значит не только "нельзя вызывать одновременно", но и вообще "нельзя вызывать разными" (пусть последовательно)

А что говорит теория, (содержательные) ссылки и.т.п.?

Спасибо 

Записан
alexis031182
Гость
« Ответ #1 : Июль 27, 2012, 17:17 »

То есть это не только в Qt? Интересно.
Записан
vregess
Гость
« Ответ #2 : Июль 27, 2012, 23:00 »

Поищи такой интересный проект - tnFox, там, как я помню, можно создавать и юзать GUI из разных потоков, возможно удастся выдрать идею.
Но предупреждаю, код там не для слабонервных (по крайней мере был раньше).

А вариант перехвата событий в главном потоке с последующей передачей в другие не рассматривается?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 28, 2012, 12:27 »

А вариант перехвата событий в главном потоке с последующей передачей в другие не рассматривается?
Оставлять главную нитку "только для UI" не всегда удобно, выгодно. Напр
Код
C++ (Qt)
#pragma omp parallel for
for (int i = 0; i < data.size(); ++i)
DoSomething(data[i]);
 
Это производительнее QtConcurrent и др т.к. поддерживается компилятором, да и в использовании проще. Однако главная нитка делает DoSomething как и остальные.

Ну и понятно что если "все UI в главной" - все будет работать. Это легко заучить/запомнить, но хотелось бы понять причину ограничений.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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