Потоки в "Дельфевых" библиотеках
От: YuRock Украина  
Дата: 28.04.04 10:52
Оценка:
Доброго всем дня! Вот нужно мне написать плугин, который работает с железякой ч-з Com-порт.
Вначале я написал экзешник (для тестов, да и отлаживать exe удобнее, чем dll) — в потоке опрашиваю Com-порт, ну и, кое-что делаю. Когда полностью отладился, все заработало — решил перенести функциональность в dll.

И тут началось самое интересное! В dll я сделал отдельный модуль, который выглядит примерно так:



unit Point;
interface
implementation

uses
 Windows, Classes;

type
 TMyThread = class(TThread)
 public
   procedure Execute; override;
 end;

var
 Thread: TMyThread;

procedure TMyThread.Execute;
begin
 MessageBox(0, '1', '', 0);
end;

initialization
 Thread := TMyThread.Create(False);
 if True then // здесь у меня своя проверка на то, что "все нормально проинициализировалось"
   ExitCode := 1; // если не "все нормально проинициализировалось" - сделать так, чтобы LoadLibrary вернула 0

finalization
 Thread.Free;

end.


Так вот, до TMyThread.Execute даже не доходит! Ну это ладно, еще можно понять... Но зачем же тогда намертво виснуть на "Thread.Free"?!!
Если конкретнее, виснет на выполнении WaitFor, который вызывается в TThread.Destroy. Что посоветуете, мастера? У меня в библиотеке не один и не два потока, и все они инициализируются, и на Free все вешаются.

Кстати, мастера, объясните, как работает параметр CreateSuspended в TThread.Create, если в BeginThread все равно передается CREATE_SUSPENDED, даже если CreateSuspended=False:


FSuspended := CreateSuspended;
FCreateSuspended := CreateSuspended;

FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);

if FHandle = 0 then
 raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);

А то что-то не понятно мне. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.