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

Здесь обсуждаются технические аспекты создания дополнений.
Cilvay
Сообщения: 816
Зарегистрирован: 14:55, 16.06.2008

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

Сообщение 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
Последний раз редактировалось Cilvay 11:03, 02.09.2012, всего редактировалось 2 раза.
Maxim Mirgorodsky
Администратор
Сообщения: 6867
Зарегистрирован: 09:56, 27.06.2005

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

Сообщение Maxim Mirgorodsky »

Вопросы синхронизации потоков и потоковой безопасности компонентов не были рассмотрены. Ни в коем случае нельзя использовать многопоточность без полного изучения этих тем.
adamix
Сообщения: 16
Зарегистрирован: 00:14, 06.02.2011

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

Сообщение adamix »

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