Не могу добиться создания отдельного потока на все время работ плагина. Т.е. поток должен создаваться при FsInit() и завершаться при выгрузке плагина из памяти. Проблема в том, что после завершения работы FsInit() поток завершает свою работу (вроде бы). В чем дело и как добиться работы потока?
function FsInit();
begin
// стандартная инициализация
// создаю поток
ThreadHandle := CreateThread(nil, 0, @MyThreadProc, nil, 0, thID);
// некая задержка, например sleep() или MessageBox()
// ....
// после окночания задержки и выхода из FSInit() поток прекращает работу.
Result := 0;
end;
В реализации кода потока и его создании ошибок нет (я на этом как говорится "собаку съел"). Скорее всего происходит смена контекста или выгрузка DLL(?). Так в чем же дело?
Жду любых советов и предложений. На любом ЯП (данный пример, дкмаю, понятен всем).
Скорее всего происходит смена контекста или выгрузка DLL(?).
Выгрузка DLL не происходит. Мне показалось, что Total выгружает их только по cm_UnloadPlugins.
TC Plugins Manager говорит, что они остаются загруженными.
А тогда в чем дело? Почему поток завершает работу? Ведь он запускается в контексте самого Командера. Получается, что для отдельного потока придется втихую запускать внешнее приложение (или вообще драйвер процессом грузить) и обращаться к нему из плагина? Или все-таки можно запускать поток каким-либо образом???
Procedure MyThreadProc;
var
i:LongInt;
Begin
i:=0;
While True do
begin
SetWindowText(FindWindow ('TTOTAL_CMD',nil),pchar(IntToStr(i)));
sleep (1000);
inc (i);
end;
End;
function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc;
pRequestProc:tRequestProc):integer; stdcall;
Begin
CreateThread(nil, 0, @MyThreadProc, nil, 0, thID);
MessageBox (FindWindow ('TTOTAL_CMD',nil),'Поток создан','',0);
End;
у меня работает великолепно.
Сначала грешил, что какие-то используемые переменные могли быть обьявлены локально - но нет, как их не обьявляй, всё работает.
Пипец... По ходу какие-то работы на сайте - на wincmd.ru тоже "откат" произошёл (я страницу плагина обновлял, потом захожу - опять всё старое).
К счастью я сохранил часть ветки на винте, инфа пригодится для TCKB. Ссылка: http://super.wincmd.ru/_tmp/thread.rar
Не восстановили еще. Ну и ладно. Повторюсь, хотя буду краток. Тотал по прежнему вылетает после выгрузки плагина. Я переделал с использованием Mutex'ов и через одно место сделанным потоком. Думал поможет. Но увы. Выложил там же (xerxde.narod.ru/dinc.dpr).
Пробовал отладить в OllyDbg. Выдает следующее:
Module D:\...\DiNC.wfx
New thread with ID 00000460 created
Unload D:\...\DiNC.wfx
Access violation when executing [00E8354E]
Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится.
Ну я напишу то же, что уже писал:
1) От версии Тотала работа не зависит (проверял на разны).
2) Оба варианта (с мьютексами и без) у меня работают как и задумано.
Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится.
Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока.
Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится.
Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока.
Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки.
Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки.
Значит сделано не правильно, если код успевает выполнится....
В свете того что твой пример и пример D1P у меня не сохранился, то публикуй код заново. :( И делаешь ли ты задержку для того чтобы твой поток успел обработать завершение? (WaitForSingleObject)