Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

потоки текут-2 или получилось наполовину 


Eraser   (2002-01-16 10:59) [0]

Спасибо ВСЕМ кто вчера помогал мне!! Но за бессоную ночь родилось много вопросов. Приведу код который я наваял (точнее списал с Demos и Panov):
//ocновная форма
var
// FirstParameter, NextParameter: integer;
T:array [1..3] of TSortThread;

procedure TSortForm.StartBtnClick(Sender: TObject);
begin
ThreadsRunning := 3;
T[1]:=TSortThread.Create(1,5);
T[2]:=TSortThread.Create(2,4);
T[3]:=TSortThread.Create(3,6);
StartBtn.Enabled := False;
end;

procedure TSortForm.Button1Click(Sender: TObject);
begin
while ThreadsRunning<>0 do begin
T[ThreadsRunning].Terminate;
Dec(ThreadsRunning);
end;
StartBtn.Enabled := True;
end;

//ThreadObject
type
TSortThread = class(TThread)
private
FFirstPar: integer;
FNextPar: integer;
public
procedure Execute; override;
procedure Rab;
constructor Create(const FirstParameter, NextParameter: integer);
end;

implementation

constructor TSortThread.Create(const FirstParameter, NextParameter: integer);
begin
inherited Create(True);
FreeOnTerminate := True;
FFirstPar := FirstParameter; //Инициализация переменных
FNextPar := NextParameter;
Resume; end;

procedure TSortThread.Execute;
begin
while not Terminated do
begin
case FFirstPar of
<верно ли здесь, будут ли 3 разных процесса с одной и той же процедурой>
1:Rab;
2:Rab;
3:Rab;
end;
end;
end;

procedure TSortThread.Rab;
var hPort:Thandle;
begin
hPort := CreateFile(PChar(FNextPar),
GENERIC_READ + GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if hPort = INVALID_HANDLE_VALUE then
label1.caption:="no";
end;

Вопрос в принципе один -где то я запутался в передаче значений форме и определении переменных(пишет что label1,hport,createfile не определены)?? Подскажите как? Ведь если делаю потоки в основной форме то все работает??
Простите за глупые вопросы, подскажите чайнику.



Polevi   (2002-01-16 11:05) [1]

procedure TSortThread.UpdateForm
begin
Form1.Caption:="no";
end;

procedure TSortThread.Rab;
var hPort:Thandle;
begin
hPort := CreateFile(PChar(FNextPar),
GENERIC_READ + GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if hPort = INVALID_HANDLE_VALUE then Synchronize(UpdateForm);
end;




Eraser   (2002-01-16 11:28) [2]

Пишет что Form1, hport, createfile не определены.



Digitman   (2002-01-16 12:07) [3]

Так подскажи Паскалю, где все это определено ! На то раздел USES и существует в любом модуле, чтобы указывать внешние по отношению к нему модули, где декларированы требуемые идентификаторы.
Подставь в USES модуля, где определен и реализован класс TSortThread, модули Windows (в нем определен ид-р CreateFile и THandle), модуль формы (в нем определен Form1). Это ж - обычные требования Паскаля ! Поток-то здесь ни при чем ..



Eraser   (2002-01-16 15:55) [4]

извините туплю причем страшно, спасибо сейчас вроде все работает, но почему то если я организую в потоке непрерывный цикл (через goto) то даже Terminate не позволяет завершить поток
T[ThreadsRunning].Terminate; ???<<и ничего не проичходит>>



panov   (2002-01-16 15:58) [5]

В цикле проверяй
if Terminated then break;



Digitman   (2002-01-17 12:14) [6]

Описание метода TThread.Terminate из help :

Signals the thread to terminate by setting the Terminated property to True.

procedure Terminate;

Description

Terminate sets the thread’s Terminated property to True, signaling that the thread should be terminated as soon as possible. Unlike the Windows API TerminateThread, which forces the thread to terminate immediately, the Terminate method merely requests that the thread terminate. This allows the thread to perform any cleanup before it shuts down.

For Terminate to work, the thread"s Execute method and any methods that Execute calls should check Terminated periodically and exit when it"s True.



yaJohn   (2002-01-17 12:24) [7]

Izviniaus, u menia ne otvet, no vopros.
Takaya situacia:
V Execute net cikla. Est vizov vneshney (ne moey i v ishodnikah ne dostupnoy) proceduri. T.e. if Terminated proveriat" negde. Kak ubit" takuu triadu? Eto voobshe vozmojno? I esli da, to chto budet s resursami videlennimi, no ne osvobojdennimi v procese vipolnenia takoy triadi?



Digitman   (2002-01-17 12:39) [8]

>yaJohn
Контролирующий поток может вызвать метод Suspend контролируемого объекта-потока и затем, следом за ним, - метод Free. Приостановленный таким образом контролируемый поток будет успешно (хотя и принудительно) снят в выполнения оп.системой и ассоциированный с потоком VCL-объект класса TThread будет успешно уничтожен. При этом нет никаких гарантий, что не возникнет утечка ресурсов. Это надо четко осознавать при любых принудительных терминирующих операциях над активными объектами ОС (а в дан.случае таковым является поток как объект ОС, который выполняет длительную операцию, не позволяющую контролировать флаг FTerminated)



yaJohn   (2002-01-17 13:12) [9]

2 Digitman
T.e. Suspend obrabativaetsia vne zavisimosti ot sostoiania potoka. Ya pravilno ponial?
Esli mojno, plzs, eshe 2 voprosa.
1. Pochemu nelzia Free bez Suspend?
2. Posle vizova Suspend mogu li ya bezopasno rabotat" s dannimi potoka (t.e. s temi, k kotorim est obrashenia iz tela potoka)? Naprimer:
Est potok for i:=0 to 100000000 do Pos:=i; gde Pos - public u TMyThread;
Ya razmeshiau na forme TTimer i OnTimer delau nechto vrode
MyTread.Suspend;
ProgressBar.Position:=MyTread.Pos;
MyTread.Resume;

Ranshe ya podobnoe cherez Synhronize delal... Krivo poluchalos do ujasa ;(



модератор   (2002-01-17 13:23) [10]

>yaJohn © (17.01.02 13:12)
Для новых вопросов создается новая ветка.



Digitman   (2002-01-17 13:52) [11]

>yaJohn
Да, вне зависимости. Ты правильно понял.

1. TThread.Free ждет завершения потока, если поток не находится в приостановленном состоянии (анализируется его св-во Suspended)и, если поток "завис" (что-то делает бесконечно долго), "зависнет" и выполнение метода Free. Если же поток приостановлен, Free не ждет его завершения (это просто бессмысленно !), а вместо этого немедленно снимает его с выполнения.
вот - реализация деструктора потока, проанализируй ее сам :

destructor TThread.Destroy;
begin
if not FFinished and not Suspended then
begin
Terminate;
WaitFor;
end;
if FHandle <> 0 then CloseHandle(FHandle);
inherited Destroy;
RemoveThread;
end;


2. Можешь. Ведь объект MyThread на этот момент ты еще не разрушил !




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.015 c
14-8982           Ивашка                2001-11-23 11:58  2002.02.04  
как защитить авторские права программы


1-8902            LoHoVski              2002-01-16 16:42  2002.02.04  
Не компилирует любые пакеты без PAS-файлов ПОМОГИТЕ!


14-8980           MJH                   2001-12-11 15:27  2002.02.04  
http://mjh.nm.ru


14-8990           fliz                  2001-12-14 16:06  2002.02.04  
чем ближе НГ-тем менее тут интересно.


1-8859            kaif                  2002-01-21 03:56  2002.02.04  
MDI и WindowMenu ???