thread в библиотеке.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

thread в библиотеке.

Сообщение alik1 » 18.01.2007 20:56:37

в общем нужно сделать следующее: есть главное приложение которое вызывает функцию из библиотеки их 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;

чуствую что где то грабли, такие большие, с топором на ручке ...
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Sergei I. Gorelkin » 18.01.2007 21:37:05

Зачем в этой ситуации нужен доп. поток? Если он будет неперывно крутиться в цикле, то займет 100% процессорного времени и система застрянет, даже если основной поток не будет блокирован.
Не проще ли проверять fAnswer_Hardware по таймеру?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение alik1 » 19.01.2007 00:39:32

ну я просто не в давался в подробности, на самом деле там не флаг, а вызов функции из еще одной библиотеки, а stop передается в нее отдельной функцией. К сожелению сам механизм поменять не могу.

procedure TWorkThread.Execute;
begin
MyFunc;
end;
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение SergKam » 19.01.2007 01:58:11

TWorkThread = class
public
procedure Execute; override;
end;
Чтото не вижу тут наследования от TThread.

TWorkThread = class(TThread)
public
procedure Execute; override;
end;

Может так? И в чем собственно вопрос?
SergKam
постоялец
 
Сообщения: 251
Зарегистрирован: 16.11.2005 21:31:11
Откуда: Украина,Харьков

Сообщение alik1 » 19.01.2007 02:18:54

SergKam писал(а):
TWorkThread = class
public
procedure Execute; override;
end;
Чтото не вижу тут наследования от TThread.

TWorkThread = class(TThread)
public
procedure Execute; override;
end;

Может так? И в чем собственно вопрос?


нет, ет я опечался .. смысл в том что мне нужно сделать ал-я ProcessMessages для глвного потока, пока выполнается "рабочий поток", в библиотеке (вин/никс). Как ет на FPC решить не понимаю.
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение Sergei I. Gorelkin » 19.01.2007 05:08:52

Тут нужно в цикле вызывать Application.HandleMessage:

Код: Выделить всё
while not SomeCondition do
  Application.HandleMessage;


Но, чтобы этот код использовать в библиотеке (вне программы), надо в нее по крайней мере указатель на Application.HandleMessage передать. Я решал подобную задачу, но поток создавал в основном приложении. А вместо цикла был показ модальной формы (в TForm.ShowModal делается то же самое, SomeCondition = ModalResult<>mrNone). Поток же перед завершением устанавливал этой форме ModalResult.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение FedeX » 19.01.2007 07:27:12

А по мойму лучше юзить BeginThread...
Когда в потоке всё что надо выполнится, поставить специальную булеву переменную в done:=true. Значение этой переменной переодически (при помощи таймера) проверять в основном потоке...
Ну не знаю хорошо ли это... я так делаю.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение alik1 » 19.01.2007 12:20:05

Sergei I. Gorelkin писал(а):Тут нужно в цикле вызывать Application.HandleMessage:

Код: Выделить всё
while not SomeCondition do
  Application.HandleMessage;


Но, чтобы этот код использовать в библиотеке (вне программы), надо в нее по крайней мере указатель на Application.HandleMessage передать. Я решал подобную задачу, но поток создавал в основном приложении. А вместо цикла был показ модальной формы (в TForm.ShowModal делается то же самое, SomeCondition = ModalResult<>mrNone). Поток же перед завершением устанавливал этой форме ModalResult.


ну с showmodal, это конечна хитро :)
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение alik1 » 19.01.2007 12:21:43

FedeX писал(а):А по мойму лучше юзить BeginThread...
Когда в потоке всё что надо выполнится, поставить специальную булеву переменную в done:=true. Значение этой переменной переодически (при помощи таймера) проверять в основном потоке...
Ну не знаю хорошо ли это... я так делаю.


ну в принципе тоже вариант, но мне не подходит - не понятно кто будет эту либу пользовать, а на всех языках делать поддержку и с таймерами разбиратся - ет себе дороже.
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03

Сообщение alik1 » 19.01.2007 12:22:25

На самом деле, придется как обычно - callback-ом ... :roll:
alik1
новенький
 
Сообщения: 24
Зарегистрирован: 16.01.2007 01:14:03


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru