Главная страница
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.013 c
1-83585
Skier
2003-05-12 16:14
2003.05.26
Какова логика выравнивания полей в записи ?


14-83752
Style
2003-05-07 13:04
2003.05.26
Вот сегодня ровно год как я отслужил срочку.


3-83329
eee
2003-05-05 12:23
2003.05.26
DBGrid


3-83357
Avreliy
2003-05-05 15:21
2003.05.26
Отображение значений поля выборки на управляющей сетке!


14-83732
Anatoly Podgoretsky
2003-05-04 10:48
2003.05.26
Статистика распространенности операционных систем 2003 год