Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Создание нити в WFX плагине

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Mon Jan 29, 2007 19:17    Post subject: Создание нити в WFX плагине Reply with quote

Не могу добиться создания отдельного потока на все время работ плагина. Т.е. поток должен создаваться при 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
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Tue Jan 30, 2007 10:24    Post subject: Reply with quote

Quote:
Скорее всего происходит смена контекста или выгрузка DLL(?).

Выгрузка DLL не происходит. Мне показалось, что Total выгружает их только по cm_UnloadPlugins.
TC Plugins Manager говорит, что они остаются загруженными.
_________________
tcPhonebook|AppLoader|Українізація TC|Ultimate Calendar
Back to top
View user's profile Send private message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Wed Jan 31, 2007 13:50    Post subject: Reply with quote

А тогда в чем дело? Почему поток завершает работу? Ведь он запускается в контексте самого Командера. Получается, что для отдельного потока придется втихую запускать внешнее приложение (или вообще драйвер процессом грузить) и обращаться к нему из плагина? Или все-таки можно запускать поток каким-либо образом???
_________________
Goth with us
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Wed Jan 31, 2007 19:14    Post subject: Reply with quote

Проблема, как любят говорить связисты, "на вашей стороне". Вот такой бесхистростный код

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
View user's profile Send private message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Fri Feb 02, 2007 22:21    Post subject: Reply with quote

Вопрос админам: А ГДЕ КОНЕЦ ЭТОЙ ВЕТКИ? ТУТ ЕЩЕ НЕСКОЛЬКО СООБЩЕНИЙ БЫЛО! ЕЩЕ ДНЕМ БЫЛИ!!! ЧТО ЗА ГЛЮКИ!
_________________
Goth with us
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Fri Feb 02, 2007 22:45    Post subject: Reply with quote

Пипец... По ходу какие-то работы на сайте - на wincmd.ru тоже "откат" произошёл (я страницу плагина обновлял, потом захожу - опять всё старое).
К счастью я сохранил часть ветки на винте, инфа пригодится для TCKB. Ссылка: http://super.wincmd.ru/_tmp/thread.rar
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Sat Feb 03, 2007 00:33    Post subject: Reply with quote

Эх, конечно кое-что восстановилось, но не все... Подожду. если не востановят, напиху снова на чем остановился.
_________________
Goth with us
Back to top
View user's profile Send private message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Sat Feb 03, 2007 14:20    Post subject: Reply with quote

Не восстановили еще. Ну и ладно. Повторюсь, хотя буду краток. Тотал по прежнему вылетает после выгрузки плагина. Я переделал с использованием 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
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Sat Feb 03, 2007 15:15    Post subject: Reply with quote

Ну я напишу то же, что уже писал:
1) От версии Тотала работа не зависит (проверял на разны).
2) Оба варианта (с мьютексами и без) у меня работают как и задумано.
_________________
База знаний о Total Commander
Блог
Back to top
View user's profile Send private message
vserd



Joined: 26 Apr 2005
Posts: 118

Post (Separately) Posted: Mon Feb 05, 2007 11:44    Post subject: Reply with quote

Xerx
Quote:

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

Это не нравится не только тоталу, но и любой программе. Заведи в потоке флаг который будешь проверять в коде потока, и если он установлен, выходить из потока.
Back to top
View user's profile Send private message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Mon Feb 05, 2007 16:30    Post subject: Reply with quote

vserd wrote:
Xerx
Quote:

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

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


Вообще-то в примере так и сделано, правда с небольшим усовершенствованием: отсутствие контексто-зависимой переменной! Так что это уже не работает. Код успевает выполнится после выгрузки библиотеки.
_________________
Goth with us
Back to top
View user's profile Send private message
vserd



Joined: 26 Apr 2005
Posts: 118

Post (Separately) Posted: Mon Feb 05, 2007 19:21    Post subject: Reply with quote

Quote:

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

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

В свете того что твой пример и пример D1P у меня не сохранился, то публикуй код заново. :( И делаешь ли ты задержку для того чтобы твой поток успел обработать завершение? (WaitForSingleObject)
Back to top
View user's profile Send private message
Xerx



Joined: 29 Jan 2007
Posts: 8
Location: Калуга

Post (Separately) Posted: Tue Feb 06, 2007 01:16    Post subject: Reply with quote

Мой пример с мютексами: http://xerxde.narod.ru/dinc.dpr

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

Тогда где ошибка?
_________________
Goth with us
Back to top
View user's profile Send private message
vserd



Joined: 26 Apr 2005
Posts: 118

Post (Separately) Posted: Tue Feb 06, 2007 11:30    Post subject: Reply with quote

Xerx
твой код на 6.56 и 7 pb2 выполняется нормально, никаких AV при закрытии тотала нет, при cm_UnloadPlugins тоже нет AV.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group