thread в библиотеке.
Модератор: Модераторы
thread в библиотеке.
в общем нужно сделать следующее: есть главное приложение которое вызывает функцию из библиотеки их 2-е (start и stop).
procedure ButtonClick1;
begin
if Start then ShowMessage('ok')
else ShowMessage('not ok or stop');
end;
procedure ButtonClick1;
begin
Stop;
end;
....
Функция ждет реакции железа т.е. делат в нити какую то работу. В этот момент у пользователя в главном приложении не должен тормозится главный поток.
вот примерный код в либе.
TWorkThread = class
public
procedure Execute; override;
end;
procedure TWorkThread.Execute;
begin
while True do if fAnswer_Hardware ot fStop then Break;
end;
function Start : boolean;
var W : TWorkThread;
begin
W := TWorkThread.Create(false);
WaitForThreadTerminate(W.Handle,0);
Result := W.Result ...
end;
procedure Stop;
begin
fStop := true;
end;
чуствую что где то грабли, такие большие, с топором на ручке ...
procedure ButtonClick1;
begin
if Start then ShowMessage('ok')
else ShowMessage('not ok or stop');
end;
procedure ButtonClick1;
begin
Stop;
end;
....
Функция ждет реакции железа т.е. делат в нити какую то работу. В этот момент у пользователя в главном приложении не должен тормозится главный поток.
вот примерный код в либе.
TWorkThread = class
public
procedure Execute; override;
end;
procedure TWorkThread.Execute;
begin
while True do if fAnswer_Hardware ot fStop then Break;
end;
function Start : boolean;
var W : TWorkThread;
begin
W := TWorkThread.Create(false);
WaitForThreadTerminate(W.Handle,0);
Result := W.Result ...
end;
procedure Stop;
begin
fStop := true;
end;
чуствую что где то грабли, такие большие, с топором на ручке ...
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
SergKam писал(а):Чтото не вижу тут наследования от TThread.TWorkThread = class
public
procedure Execute; override;
end;TWorkThread = class(TThread)
public
procedure Execute; override;
end;
Может так? И в чем собственно вопрос?
нет, ет я опечался .. смысл в том что мне нужно сделать ал-я ProcessMessages для глвного потока, пока выполнается "рабочий поток", в библиотеке (вин/никс). Как ет на FPC решить не понимаю.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Тут нужно в цикле вызывать Application.HandleMessage:
Но, чтобы этот код использовать в библиотеке (вне программы), надо в нее по крайней мере указатель на Application.HandleMessage передать. Я решал подобную задачу, но поток создавал в основном приложении. А вместо цикла был показ модальной формы (в TForm.ShowModal делается то же самое, SomeCondition = ModalResult<>mrNone). Поток же перед завершением устанавливал этой форме ModalResult.
Код: Выделить всё
while not SomeCondition do
Application.HandleMessage;
Но, чтобы этот код использовать в библиотеке (вне программы), надо в нее по крайней мере указатель на Application.HandleMessage передать. Я решал подобную задачу, но поток создавал в основном приложении. А вместо цикла был показ модальной формы (в TForm.ShowModal делается то же самое, SomeCondition = ModalResult<>mrNone). Поток же перед завершением устанавливал этой форме ModalResult.
Sergei I. Gorelkin писал(а):Тут нужно в цикле вызывать Application.HandleMessage:Код: Выделить всё
while not SomeCondition do
Application.HandleMessage;
Но, чтобы этот код использовать в библиотеке (вне программы), надо в нее по крайней мере указатель на Application.HandleMessage передать. Я решал подобную задачу, но поток создавал в основном приложении. А вместо цикла был показ модальной формы (в TForm.ShowModal делается то же самое, SomeCondition = ModalResult<>mrNone). Поток же перед завершением устанавливал этой форме ModalResult.
ну с showmodal, это конечна хитро
FedeX писал(а):А по мойму лучше юзить BeginThread...
Когда в потоке всё что надо выполнится, поставить специальную булеву переменную в done:=true. Значение этой переменной переодически (при помощи таймера) проверять в основном потоке...
Ну не знаю хорошо ли это... я так делаю.
ну в принципе тоже вариант, но мне не подходит - не понятно кто будет эту либу пользовать, а на всех языках делать поддержку и с таймерами разбиратся - ет себе дороже.
