Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
14-83708
Sherbacov
2003-05-06 19:50
2003.05.26
Хеш вектор


3-83416
Hmuriy
2003-05-06 22:25
2003.05.26
символьное поле


14-83675
pasha_golub
2003-05-05 20:29
2003.05.26
Встреча Мастаков в Москве


3-83396
Lefan
2003-05-06 11:37
2003.05.26
TDataModule


3-83366
Kirill_S
2003-05-05 18:51
2003.05.26
Господа, помогите с QReport !





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский