Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

потоки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
11-83432
Gandalf
2002-08-19 10:34
2003.05.26
Result:=(KOL) or (KOL and MCK);


6-83640
brestmarket
2003-03-25 11:21
2003.05.26
Поиск/Вставка/замена в исходнике HTML на сервере?


1-83499
natasha
2003-05-15 14:28
2003.05.26
как корректно закрыть формочку?


14-83683
Dmitriy_R
2003-05-06 07:08
2003.05.26
ServerSocket


1-83478
lia
2003-05-15 09:32
2003.05.26
Как запустить программу с параметрами?