Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Июль 27, 2012, 16:40



Название: UI в (не) главной thread
Отправлено: Igors от Июль 27, 2012, 16:40
Добрый день

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

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

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

Спасибо 



Название: Re: UI в (не) главной thread
Отправлено: alexis031182 от Июль 27, 2012, 17:17
То есть это не только в Qt? Интересно.


Название: Re: UI в (не) главной thread
Отправлено: vregess от Июль 27, 2012, 23:00
Поищи такой интересный проект - tnFox (http://www.nedprod.com/TnFOX/), там, как я помню, можно создавать и юзать GUI из разных потоков, возможно удастся выдрать идею.
Но предупреждаю, код там не для слабонервных (по крайней мере был раньше).

А вариант перехвата событий в главном потоке с последующей передачей в другие не рассматривается?


Название: Re: UI в (не) главной thread
Отправлено: Igors от Июль 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 в главной" - все будет работать. Это легко заучить/запомнить, но хотелось бы понять причину ограничений.