Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 на этот момент ты еще не разрушил !



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.005 c
1-8856
Sensor
2002-01-21 12:38
2002.02.04
Transparant


1-8831
BJValentine
2002-01-20 12:11
2002.02.04
Экран


3-8777
Слава
2002-01-08 08:09
2002.02.04
Как убрать диалоговое окно Удаленного доступа?


1-8897
dimonf
2002-01-15 14:40
2002.02.04
График.


1-8820
shagen
2002-01-18 19:25
2002.02.04
Глупый, но важный вопрос.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский