Есть у меня свой DataSet, который умеет всё общение с сервером БД выполнять в фоне, в отдельной нити. Ну, что б юзер, ожидая результат, мог хотя бы окно передвинуть. Сейчас (под windows реализовано) просто: есть отдельная нить (thread), который ждет задание. Главная нить готовит задание, освобождает рабочую нить и ждёт окончание выполнения (TEvent), используя MsgWaitForMultipleObjects. Если в очередь поступило сообщение, вызывается событие компонента, на который разработчик приложения вешает Application.ProcessMessages.
Псевдокод:
- Код: Выделить всё
procedure THtDataSet.CreateCursor;
var rc: integer;
begin
.........
FTask:= PrepareTask(FSql.Text); // Задание для Thread
FEvJob.SetEvent; // рабочий Thread ожидает этот Event
repeat
rc:= MsgWaitForMultipleObjects(3, Hadles, false, 150, QS_ALLINPUT);
case rc of
WAIT_OBJECT_0 : DoHandleCallBack; // call back signaled
WAIT_OBJECT_0+1, // completed
WAIT_OBJECT_0+2: break; // thread terminated
WAIT_OBJECT_0+3: HandleMessages; // message
WAIT_TIMEOUT : HandleIdle; // every 150 ms
end;
until false;
.............
end;
Как бы подобное выкрутить в линуксе? Если оставить этот алгоритм, то нужен какой-нибудь сигнал, что пора вызывать ProcessMessages, и средство ожидания, аналогичное MsgWaitForMultipleObjects. Или в lin есть свои способы?
Вот только чего не хотелось бы, так это перекладывать управление многопоточностью на разработчика приложения. В Win вот удалось; достаточно в свойстве компонента выбрать режим работы (синхронный/асинхронный), весь механизм уже "у ей внутре" (с).
Добавлено спустя 3 часа 19 минут 31 секунду:
Нашел "condition variable", теперь понятно (хоть и не привычно), как ждать "любой из", но как при этом ждать появление события от пользователя (аналог Message в Win)??