Страница 1 из 1

...если хотите, чтобы работа плагина не вешала сервер/чат

Добавлено: 18:56, 26.08.2011
Cilvay
Как мы знаем, что если произошло событие (PluginProcess, PluginStart и т.д.) то чат "замирает" на некоторое количество времени и ждет, пока не выполнится эта функция. Это может быть и незаметно вовсе, если это что-то простое, типа простой отправки сообщения и т.д. Но когда требуется выполнить сложный цикл, или ожидать пока компонент веб-браузер (TWebBrouser) загрузит страницу, или какой нить TIndySmtp подключится к серверу, то чат и сервер начинают зависать и ждать завершения выполнения. Выход есть - нужно все эти долгие процедуры (циклы, соединения, вычисления) выполнять в отдельном потоке.
Пишем после 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;
все. теперь каждый раз при вызове PluginProcess будет создаваться поток, который параллельно будет выполнятся с основным, автоматически завершаясь после выполнения.
Прочитать про синхронизацию потоков можете тут: http://www.delphikingdom.com/asp/viewit ... logid=1370

Re: ...если хотите, чтобы работа плагина не вешала сервер/ча

Добавлено: 11:07, 27.08.2011
Maxim Mirgorodsky
Вопросы синхронизации потоков и потоковой безопасности компонентов не были рассмотрены. Ни в коем случае нельзя использовать многопоточность без полного изучения этих тем.

Re: ...если хотите, чтобы работа плагина не вешала сервер/ча

Добавлено: 11:17, 01.09.2011
adamix
Лучше-бы сделали функцию аля OnServerPulse, которая бы вызывалась каждый раз в основном потоке чата.