...если хотите, чтобы работа плагина не вешала сервер/чат
Добавлено: 18:56, 26.08.2011
Как мы знаем, что если произошло событие (PluginProcess, PluginStart и т.д.) то чат "замирает" на некоторое количество времени и ждет, пока не выполнится эта функция. Это может быть и незаметно вовсе, если это что-то простое, типа простой отправки сообщения и т.д. Но когда требуется выполнить сложный цикл, или ожидать пока компонент веб-браузер (TWebBrouser) загрузит страницу, или какой нить TIndySmtp подключится к серверу, то чат и сервер начинают зависать и ждать завершения выполнения. Выход есть - нужно все эти долгие процедуры (циклы, соединения, вычисления) выполнять в отдельном потоке.
Пишем после type это
Затем в самой функции (например pluginprocess) пишем код:
Теперь все свои тяжелые вычисления поместите в функцию:
все. теперь каждый раз при вызове PluginProcess будет создаваться поток, который параллельно будет выполнятся с основным, автоматически завершаясь после выполнения.
Прочитать про синхронизацию потоков можете тут: http://www.delphikingdom.com/asp/viewit ... logid=1370
Пишем после type это
Код: Выделить всё
type
.......
......
TNewThread = class(TThread)
public
procedure Execute;override;
end;
Затем в самой функции (например pluginprocess) пишем код:
Код: Выделить всё
procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD);
var
NewThread: TNewThread;
.....
begin
NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=true; //поток автоматически завершается после выполнения
NewThread.Priority:=tpLower; //приоритет потока
NewThread.Resume; //запуск потока
end;
Теперь все свои тяжелые вычисления поместите в функцию:
Код: Выделить всё
procedure TNewThread.Execute;
begin
...
end;
Прочитать про синхронизацию потоков можете тут: http://www.delphikingdom.com/asp/viewit ... logid=1370