Создание нити в WFX плагине
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Написание плагинов для Total Commander

#1: Создание нити в WFX плагине Author: XerxLocation: Калуга PostPosted: Mon Jan 29, 2007 19:17
    —
Не могу добиться создания отдельного потока на все время работ плагина. Т.е. поток должен создаваться при FsInit() и завершаться при выгрузке плагина из памяти. Проблема в том, что после завершения работы FsInit() поток завершает свою работу (вроде бы). В чем дело и как добиться работы потока?

Урезаный вариант:

Code:
function FsInit();
begin
// стандартная инициализация
// создаю поток
    ThreadHandle := CreateThread(nil, 0, @MyThreadProc, nil, 0, thID);
// некая задержка, например sleep() или MessageBox()
// ....

// после окночания задержки и выхода из FSInit() поток прекращает работу.

   Result := 0;
end;


В реализации кода потока и его создании ошибок нет (я на этом как говорится "собаку съел"). Скорее всего происходит смена контекста или выгрузка DLL(?). Так в чем же дело?

Жду любых советов и предложений. На любом ЯП (данный пример, дкмаю, понятен всем).

#2:  Author: MaximusLocation: Украина, Кировоградская обл., г. Знаменка PostPosted: Tue Jan 30, 2007 10:24
    —
Quote:
Скорее всего происходит смена контекста или выгрузка DLL(?).

Выгрузка DLL не происходит. Мне показалось, что Total выгружает их только по cm_UnloadPlugins.
TC Plugins Manager говорит, что они остаются загруженными.

#3:  Author: XerxLocation: Калуга PostPosted: Wed Jan 31, 2007 13:50
    —
А тогда в чем дело? Почему поток завершает работу? Ведь он запускается в контексте самого Командера. Получается, что для отдельного потока придется втихую запускать внешнее приложение (или вообще драйвер процессом грузить) и обращаться к нему из плагина? Или все-таки можно запускать поток каким-либо образом???

#4:  Author: D1PLocation: Тбилиси PostPosted: Wed Jan 31, 2007 19:14
    —
Проблема, как любят говорить связисты, "на вашей стороне". Вот такой бесхистростный код

Code:

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;

у меня работает великолепно.
Сначала грешил, что какие-то используемые переменные могли быть обьявлены локально - но нет, как их не обьявляй, всё работает.

#5:  Author: XerxLocation: Калуга PostPosted: Fri Feb 02, 2007 22:21
    —
Вопрос админам: А ГДЕ КОНЕЦ ЭТОЙ ВЕТКИ? ТУТ ЕЩЕ НЕСКОЛЬКО СООБЩЕНИЙ БЫЛО! ЕЩЕ ДНЕМ БЫЛИ!!! ЧТО ЗА ГЛЮКИ!

#6:  Author: D1PLocation: Тбилиси PostPosted: Fri Feb 02, 2007 22:45
    —
Пипец... По ходу какие-то работы на сайте - на wincmd.ru тоже "откат" произошёл (я страницу плагина обновлял, потом захожу - опять всё старое).
К счастью я сохранил часть ветки на винте, инфа пригодится для TCKB. Ссылка: http://super.wincmd.ru/_tmp/thread.rar

#7:  Author: XerxLocation: Калуга PostPosted: Sat Feb 03, 2007 00:33
    —
Эх, конечно кое-что восстановилось, но не все... Подожду. если не востановят, напиху снова на чем остановился.

#8:  Author: XerxLocation: Калуга PostPosted: Sat Feb 03, 2007 14:20
    —
Не восстановили еще. Ну и ладно. Повторюсь, хотя буду краток. Тотал по прежнему вылетает после выгрузки плагина. Я переделал с использованием Mutex'ов и через одно место сделанным потоком. Думал поможет. Но увы. Выложил там же ([url]xerxde.narod.ru/dinc.dpr[/url]).

Пробовал отладить в OllyDbg. Выдает следующее:
Quote:
Module D:\...\DiNC.wfx
New thread with ID 00000460 created
Unload D:\...\DiNC.wfx
Access violation when executing [00E8354E]


Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится.

#9:  Author: D1PLocation: Тбилиси PostPosted: Sat Feb 03, 2007 15:15
    —
Ну я напишу то же, что уже писал:
1) От версии Тотала работа не зависит (проверял на разны).
2) Оба варианта (с мьютексами и без) у меня работают как и задумано.

#10:  Author: vserd PostPosted: Mon Feb 05, 2007 11:44
    —
Xerx
Quote:

Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится.

Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока.

#11:  Author: XerxLocation: Калуга PostPosted: Mon Feb 05, 2007 16:30
    —
vserd wrote:
Xerx
Quote:

Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится.

Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока.


Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки.

#12:  Author: vserd PostPosted: Mon Feb 05, 2007 19:21
    —
Quote:

Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки.

Значит сделано не правильно, если код успевает выполнится....

В свете того что твой пример и пример D1P у меня не сохранился, то публикуй код заново. :( И делаешь ли ты задержку для того чтобы твой поток успел обработать завершение? (WaitForSingleObject)

#13:  Author: XerxLocation: Калуга PostPosted: Tue Feb 06, 2007 01:16
    —
Мой пример с мютексами: http://xerxde.narod.ru/dinc.dpr

Quote:
Значит сделано не правильно, если код успевает выполнится....

Тогда где ошибка?

#14:  Author: vserd PostPosted: Tue Feb 06, 2007 11:30
    —
Xerx
твой код на 6.56 и 7 pb2 выполняется нормально, никаких AV при закрытии тотала нет, при cm_UnloadPlugins тоже нет AV.



Total Commander -> Написание плагинов для Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group