View previous topic :: View next topic |
Author |
Message |
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Mon Jan 29, 2007 19:17 Post subject: Создание нити в WFX плагине |
|
|
Не могу добиться создания отдельного потока на все время работ плагина. Т.е. поток должен создаваться при FsInit() и завершаться при выгрузке плагина из памяти. Проблема в том, что после завершения работы FsInit() поток завершает свою работу (вроде бы). В чем дело и как добиться работы потока?
Урезаный вариант:
Code: | function FsInit();
begin
// стандартная инициализация
// создаю поток
ThreadHandle := CreateThread(nil, 0, @MyThreadProc, nil, 0, thID);
// некая задержка, например sleep() или MessageBox()
// ....
// после окночания задержки и выхода из FSInit() поток прекращает работу.
Result := 0;
end; |
В реализации кода потока и его создании ошибок нет (я на этом как говорится "собаку съел"). Скорее всего происходит смена контекста или выгрузка DLL(?). Так в чем же дело?
Жду любых советов и предложений. На любом ЯП (данный пример, дкмаю, понятен всем). _________________ Goth with us |
|
Back to top |
|
|
Maximus
Joined: 07 Apr 2005 Posts: 927 Location: Украина, Кировоградская обл., г. Знаменка
|
(Separately) Posted: Tue Jan 30, 2007 10:24 Post subject: |
|
|
Quote: | Скорее всего происходит смена контекста или выгрузка DLL(?). |
Выгрузка DLL не происходит. Мне показалось, что Total выгружает их только по cm_UnloadPlugins.
TC Plugins Manager говорит, что они остаются загруженными. _________________ tcPhonebook|AppLoader|Українізація TC|Ultimate Calendar |
|
Back to top |
|
|
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Wed Jan 31, 2007 13:50 Post subject: |
|
|
А тогда в чем дело? Почему поток завершает работу? Ведь он запускается в контексте самого Командера. Получается, что для отдельного потока придется втихую запускать внешнее приложение (или вообще драйвер процессом грузить) и обращаться к нему из плагина? Или все-таки можно запускать поток каким-либо образом??? _________________ Goth with us |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Wed Jan 31, 2007 19:14 Post subject: |
|
|
Проблема, как любят говорить связисты, "на вашей стороне". Вот такой бесхистростный код
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;
|
у меня работает великолепно.
Сначала грешил, что какие-то используемые переменные могли быть обьявлены локально - но нет, как их не обьявляй, всё работает. _________________ База знаний о Total Commander
Блог |
|
Back to top |
|
|
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Fri Feb 02, 2007 22:21 Post subject: |
|
|
Вопрос админам: А ГДЕ КОНЕЦ ЭТОЙ ВЕТКИ? ТУТ ЕЩЕ НЕСКОЛЬКО СООБЩЕНИЙ БЫЛО! ЕЩЕ ДНЕМ БЫЛИ!!! ЧТО ЗА ГЛЮКИ! _________________ Goth with us |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
|
Back to top |
|
|
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Sat Feb 03, 2007 00:33 Post subject: |
|
|
Эх, конечно кое-что восстановилось, но не все... Подожду. если не востановят, напиху снова на чем остановился. _________________ Goth with us |
|
Back to top |
|
|
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Sat Feb 03, 2007 14:20 Post subject: |
|
|
Не восстановили еще. Ну и ладно. Повторюсь, хотя буду краток. Тотал по прежнему вылетает после выгрузки плагина. Я переделал с использованием 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) это ОЧЕНЬ не нравится. _________________ Goth with us |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Sat Feb 03, 2007 15:15 Post subject: |
|
|
Ну я напишу то же, что уже писал:
1) От версии Тотала работа не зависит (проверял на разны).
2) Оба варианта (с мьютексами и без) у меня работают как и задумано. _________________ База знаний о Total Commander
Блог |
|
Back to top |
|
|
vserd
Joined: 26 Apr 2005 Posts: 118
|
(Separately) Posted: Mon Feb 05, 2007 11:44 Post subject: |
|
|
Xerx
Quote: |
Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится. |
Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока. |
|
Back to top |
|
|
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Mon Feb 05, 2007 16:30 Post subject: |
|
|
vserd wrote: | Xerx
Quote: |
Вот и получается, что все дело в том, что после выгрузки DLL, кода в памяти уже нет, а поток пытается выполняться. Моему Тоталу (6.52/6.53) это ОЧЕНЬ не нравится. |
Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока. |
Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки. _________________ Goth with us |
|
Back to top |
|
|
vserd
Joined: 26 Apr 2005 Posts: 118
|
(Separately) Posted: Mon Feb 05, 2007 19:21 Post subject: |
|
|
Quote: |
Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки. |
Значит сделано не правильно, если код успевает выполнится....
В свете того что твой пример и пример D1P у меня не сохранился, то публикуй код заново. :( И делаешь ли ты задержку для того чтобы твой поток успел обработать завершение? (WaitForSingleObject) |
|
Back to top |
|
|
Xerx
Joined: 29 Jan 2007 Posts: 8 Location: Калуга
|
(Separately) Posted: Tue Feb 06, 2007 01:16 Post subject: |
|
|
Мой пример с мютексами: http://xerxde.narod.ru/dinc.dpr
Quote: | Значит сделано не правильно, если код успевает выполнится.... |
Тогда где ошибка? _________________ Goth with us |
|
Back to top |
|
|
vserd
Joined: 26 Apr 2005 Posts: 118
|
(Separately) Posted: Tue Feb 06, 2007 11:30 Post subject: |
|
|
Xerx
твой код на 6.56 и 7 pb2 выполняется нормально, никаких AV при закрытии тотала нет, при cm_UnloadPlugins тоже нет AV. |
|
Back to top |
|
|
|