Здравствуйте, YuRock, Вы писали:
YR>Доброго всем дня! Вот нужно мне написать плугин, который работает с железякой ч-з Com-порт.
YR>Вначале я написал экзешник (для тестов, да и отлаживать exe удобнее, чем dll) — в потоке опрашиваю Com-порт, ну и, кое-что делаю. Когда полностью отладился, все заработало — решил перенести функциональность в dll.
YR>И тут началось самое интересное! В dll я сделал отдельный модуль, который выглядит примерно так:
[skip]
С моей колокольни это видится так:
1. Создаёшь нужный тебе объект, потом в DLL описываешь функцию
function ThreadFunc(s: Pointer):DWORD;stdcall;
var
[skip]
begin
[skip]
ExitThread(0);
end;
далее делаешь ещё одну, вида
function RunProc : Cardinal;
result := CreateThread(nil,512,@ThreadFunc,Self,0,ThreadId);
// возвращаемое значение result лучше сохранить,
// т.к. если вдруг нужно будет эктсненно прибить этот трид, нужно будет знать его ID
end;
вот собственно и всё, и не надо возиться с делфёвым тридом, имхо, если потоки "из DLL" (если можно так выразиться) плодить, то лучше воспользоваться WinAPI. Единственное, придётся повозиться с тем, что бы корректно эти потоки прибивать, когда выходишь из проги, когда процесс ещё выполняется. Для этого пригодится
var
result : DWORD;
begin
TerminateThread(ThreadLink, result); // ThreadLink - это то, что вернуло RunProc
ThreadLink := 0;
ну и если потоку надо общаться, то можно всё это оформить сообщениями Windows или накидать простенькие COM интерфейсы.