Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Внизпотоки Найти похожие ветки
← →
Alexno (2003-05-14 15:05) [0]Здравствуйте! Как сделать одновременное подключение к нескольким серверам с использованием TNMPOP3 и с использованием нитей?
Из главного модуля плодятся потоки. Вот как POP"ы надо описать и использовать тут?
(ThreadsRunning : Integer - для непревышения предустановленного количества одновременно работающих соединений)
===
unit Threads;
interface
uses
Windows, SysUtils, Classes, NMpop3, forms;
type
TChkHostsThread = class(TThread)
protected
procedure Execute; override;
public
fHost:string;
constructor CreateIt(const AHOST:string);
end;
implementation
uses Main;
constructor TChkHostsThread.CreateIt(const AHOST:string);
begin
inherited Create(False);
fHost:=AHOST;
FreeOnTerminate:=TRUE;
Inc(Main.ThreadsRunning);
end;
function CheckHost(host : string) : integer;
begin
Result:=0;
// тут будет все основное выполняться, соединение с нужным host и т.д.
end;
procedure TChkHostsThread.Execute;
begin
CheckHost(fHost);
Terminate();
Dec(Main.ThreadsRunning);
end;
end.
← →
Dms (2003-05-14 15:13) [1]в CheckHost надо создать объект TNMPOP3 (объявленный в классе потока), а в конце его надо .Free
← →
Alexno (2003-05-14 15:18) [2]а в какой секции его объявить надо?
← →
Dms (2003-05-14 15:24) [3]объявиви в private, а вообще это _почти_ неважно
← →
Alexno (2003-05-14 15:28) [4]А саму фонкцию CheckHost тоже надо в классе объявлять? Потому как если не в классе, то объявленного объекта из нее не видно
← →
Digitman (2003-05-14 15:28) [5]
> а в какой секции его объявить надо?
да в какой хочешь !) этот объект будет использован только в тек. юните и только данным экз-ром класса потока ... для надежности можешь в private разместить, к примеру
>Inc(Main.ThreadsRunning);
>Dec(Main.ThreadsRunning);
не есть это хорошо.
либо используй семафор/мьютекс (что лучше в дан.случае) либо ф-ции InterlockedIncrement/Decrement (для исключения ситуации одновременного обращения нескольких потоков к этой переменной)
constructor TChkHostsThread.CreateIt(const AHOST:string);
begin
inherited Create( True); // !!!!!
fHost:=AHOST;
FreeOnTerminate:=TRUE;
Inc(Main.ThreadsRunning);
Resume;
end;
procedure TChkHostsThread.Execute;
begin
CheckHost(fHost);
// Terminate(); это - лишнее
Dec(Main.ThreadsRunning); // это лучше перенести в дан.случае в переопределенный метод-деструктор
end;
← →
Dms (2003-05-14 15:46) [6]
> А саму фонкцию CheckHost тоже надо в классе объявлять? Потому
> как если не в классе, то объявленного объекта из нее не
> видно
потому что он объявлен в Private. Сделай CheckHost методом класса потока - так будет красивей.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c