Threads.... Блин
От: RI Украина  
Дата: 14.09.04 23:33
Оценка:
в общем есть такая ситуация.

привожу код


program Project_Threads;

uses
  Windows,
  Forms,
  Classes,
  Threads in 'Threads.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  h1 := GetCurrentThread;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


потом где-то в модуле threads.pas


var
.....
  h1,h2:THandle;
  id2:DWord;
  ec1:dword;

procedure TForm1.Button2Click(Sender: TObject);
begin
  h2:=CreateThread(nil,0,@GetFromFile,nil,0,id2);
end;

procedure GetFromFile;
begin
       GetExitCodeThread(h1,ec1);
       TerminateThread(h1,ec1);
end;


То есть мне нужно, чтобы второй поток убил первый, но не получается. Какие есть варианты?
Re: Threads.... Блин
От: BlackBox Россия ---
Дата: 15.09.04 04:39
Оценка: +1
Здравствуйте, RI, Вы писали:

RI>в общем есть такая ситуация.


RI>привожу код



RI>То есть мне нужно, чтобы второй поток убил первый, но не получается. Какие есть варианты?


Может у тебя не получается убить поток, потому что он является родительским для твоего второго потока.
Re: Threads.... Блин
От: Jack128  
Дата: 15.09.04 09:01
Оценка:
Здравствуйте, RI, Вы писали:

RI>в общем есть такая ситуация.


RI>привожу код



RI>
RI>program Project_Threads;

RI>uses
RI>  Windows,
RI>  Forms,
RI>  Classes,
RI>  Threads in 'Threads.pas' {Form1};

RI>{$R *.res}

RI>begin
RI>  Application.Initialize;
RI>  h1 := GetCurrentThread;
Цитата из WinSDK 

The return value is a pseudohandle for the current thread. 
A pseudohandle is a special constant that is interpreted as the current thread handle. The calling thread can use this handle to specify itself whenever a thread handle is required. 

RI>  Application.CreateForm(TForm1, Form1);
RI>  Application.Run;
RI>end.
RI>


RI>потом где-то в модуле threads.pas



RI>
RI>var
RI>.....
RI>  h1,h2:THandle;
RI>  id2:DWord;
RI>  ec1:dword;

RI>procedure TForm1.Button2Click(Sender: TObject);
RI>begin
RI>  h2:=CreateThread(nil,0,@GetFromFile,nil,0,id2);
RI>end;

RI>procedure GetFromFile;
RI>begin
RI>       GetExitCodeThread(h1,ec1);
  // А зечем запрашивать экзит код потока, который ещё не завершился??
RI>       TerminateThread(h1,ec1); 
 // h1 - псевдо хенд, идентефицирующий ТЕКУЩИЙ поток. То есть сейчас ты пытаешься уничтожить дополнительный поток.
  // ты посмотри в отладчике и увидешь, что h1 = h2
  // И вообще коли те так нужно завершить основной поток, тот лудше используй Application.Terminate 
RI>end;
RI>


RI>То есть мне нужно, чтобы второй поток убил первый, но не получается. Какие есть варианты?
Re[2]: Threads.... Блин
От: Jack128  
Дата: 15.09.04 09:09
Оценка:
И еще, коль не хочешь использовать TThread, то работай хотя бы с BeginThread, но уж никак не CreateThread
Re[2]: Threads.... Блин
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 15.09.04 12:23
Оценка: 1 (1)
J>Цитата из WinSDK
J>The return value is a pseudohandle for the current thread.
J>A pseudohandle is a special constant that is interpreted as the current thread handle. The calling thread can use this handle to specify itself whenever a thread handle is required.

То бишь если уж так надо, можно проюзать DuplicateHandle, чтобы получить хендл на первый поток, действительный во втором потоке. А вообще убивать потоки насильственно очень непрактично. Лучше уж выставить какой-нибудь флаг, а в убиваемом потоке ждать, пока он не окажется выставлен, и тогда завершиться самостоятельно (читай — корректно).

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[3]: Threads.... Блин
От: Jack128  
Дата: 15.09.04 19:17
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:
Лучше уж выставить какой-нибудь флаг, а в убиваемом потоке ждать, пока он не окажется выставлен, и тогда завершиться самостоятельно (читай — корректно).


Для VCL потока этот флаг Application.FTerminate, а выставить этот флаг можно методом Application.Terminate ...
Re[4]: Threads.... Блин
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.09.04 06:06
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Slicer [Mirkwood], Вы писали:

J>Лучше уж выставить какой-нибудь флаг, а в убиваемом потоке ждать, пока он не окажется выставлен, и тогда завершиться самостоятельно (читай — корректно).


J>Для VCL потока этот флаг Application.FTerminate, а выставить этот флаг можно методом Application.Terminate ...

Application.Terminated. Для потока, соответственно, TThread.Terminated.
... << RSDN@Home 1.1.4 @@subversion >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Threads.... Блин
От: Аноним  
Дата: 16.09.04 13:21
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Jack128, Вы писали:


J>>Здравствуйте, Slicer [Mirkwood], Вы писали:

J>>Лучше уж выставить какой-нибудь флаг, а в убиваемом потоке ждать, пока он не окажется выставлен, и тогда завершиться самостоятельно (читай — корректно).

У меня есть два потока, в одном из которых форма.
Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два.
Re[6]: Threads.... Блин
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.04 05:20
Оценка:
Здравствуйте, <Аноним>, Вы писали:
А>У меня есть два потока, в одном из которых форма.
А>Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два.
А форму ты тоже собираешься убить? По-моему, ты неправильно ставмшь задачу. Расскажи, зачем тебе это.
... << RSDN@Home 1.1.4 @@subversion >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Threads.... Блин
От: Аноним  
Дата: 17.09.04 13:21
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:

А>>У меня есть два потока, в одном из которых форма.
А>>Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два.
S>А форму ты тоже собираешься убить? По-моему, ты неправильно ставмшь задачу. Расскажи, зачем тебе это.

Да собираюсь убить
Потому что такое задание, мне оно конечно на фиг не надо, но сказали...

Общая схема:
один поток организов. форму и генерирует рендомом числа
второй считывает числа из файла
когда число совпадает то активизируется третий поток
который разрушает первые два и предлагает или выйти
или снова их запустить...
бред полный... препод больной на голову...
хотя с другой стороны даже интересно...
Re[8]: Threads.... Блин
От: Jack128  
Дата: 17.09.04 13:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Sinclair, Вы писали:


S>>Здравствуйте, <Аноним>, Вы писали:

А>>>У меня есть два потока, в одном из которых форма.
А>>>Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два.
S>>А форму ты тоже собираешься убить? По-моему, ты неправильно ставмшь задачу. Расскажи, зачем тебе это.

А>Да собираюсь убить

А>Потому что такое задание, мне оно конечно на фиг не надо, но сказали...

А>Общая схема:

А>один поток организов. форму и генерирует рендомом числа

это основной поток VCL

А>второй считывает числа из файла

А>когда число совпадает то активизируется третий поток
В сысле второй поток активизирует третий??
А>который разрушает первые два и предлагает или выйти
А>или снова их запустить...

Ну убить и запустить доп поток — это не проблема, да и убить поток VCL тооже не сложно(см мой первый ответ) а вот с ПОВТОРНЫМ запуском VCL потока я чесно говоря не сталкивался, но рискну предположить, что нужно создать его эмуляцию, то есть поток в методе Execute, которого будет что нить типа этого:

procedure TVCLThread.Execute;
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end;

А>бред полный... препод больной на голову...

Ну тот чтот это бред — это ясно.. А что не ясно — ты исполузуешь VCL и "организоваешь ФОРМУ" или вс таки на апи создаешь окно??
А>хотя с другой стороны даже интересно...
Re[9]: Threads.... Блин
От: Аноним  
Дата: 17.09.04 14:16
Оценка:
А>>Потому что такое задание, мне оно конечно на фиг не надо, но сказали...

А>>Общая схема:

А>>один поток организов. форму и генерирует рендомом числа

J>это основной поток VCL

yes

А>>второй считывает числа из файла

А>>когда число совпадает то активизируется третий поток
J>В сысле второй поток активизирует третий??
yes

А>>который разрушает первые два и предлагает или выйти

А>>или снова их запустить...

J>Ну убить и запустить доп поток — это не проблема, да и убить поток VCL тооже не сложно

да вот сложно. Как я понял, не получается у меня duplicatehandle() никак. И вообще мне на другом форуме сказали, что этот поток основной, и убъешь его — завершишь приложение...

(см мой первый ответ) а вот с ПОВТОРНЫМ запуском VCL потока я чесно говоря не сталкивался, но рискну предположить, что нужно создать его эмуляцию, то есть поток в методе Execute, которого будет что нить типа этого:

J>procedure TVCLThread.Execute;

J>begin
J> Application.Initialize;
J> Application.CreateForm(TMainForm, MainForm);
J> Application.Run;
J>end;

А>>бред полный... препод больной на голову...

J>Ну тот чтот это бред — это ясно.. А что не ясно — ты исполузуешь VCL и "организоваешь ФОРМУ" или вс таки на апи создаешь окно??

Да могу и так и так — не принципиально. В данный момент хочу без винапи сделать. то есть крейт форм и т.д.
А>>хотя с другой стороны даже интересно...
Re[10]: Threads.... Блин
От: Jack128  
Дата: 17.09.04 14:32
Оценка:
Здравствуйте, Аноним, Вы писали:

J>>Ну убить и запустить доп поток — это не проблема, да и убить поток VCL тооже не сложно

А>да вот сложно. Как я понял, не получается у меня duplicatehandle() никак.

DuplicateHandle(GetCurrentProcess, GetCurrentThread, GetCurrentProcess, MainThreadHandle, 0, False, DUPLICATE_SAME_ACCESS);


И вообще мне на другом форуме сказали, что этот поток основной, и убъешь его — завершишь приложение...
Нет — это не так.
Еще раз повторю — использовать TerminateThread — это очень, очень, ОЧЕНЬ плохо.

А>(см мой первый ответ) а вот с ПОВТОРНЫМ запуском VCL потока я чесно говоря не сталкивался, но рискну предположить, что нужно создать его эмуляцию, то есть поток в методе Execute, которого будет что нить типа этого:


J>>procedure TVCLThread.Execute;

J>>begin
J>> Application.Initialize;
J>> Application.CreateForm(TMainForm, MainForm);
J>> Application.Run;
J>>end;

А>>>бред полный... препод больной на голову...

J>>Ну тот чтот это бред — это ясно.. А что не ясно — ты исполузуешь VCL и "организоваешь ФОРМУ" или вс таки на апи создаешь окно??

А>Да могу и так и так — не принципиально. В данный момент хочу без винапи сделать. то есть крейт форм и т.д.

Ну давай.. О результатах потом расскажи..
А>>>хотя с другой стороны даже интересно...
Re[11]: Threads.... Блин
От: Аноним  
Дата: 17.09.04 14:36
Оценка:
Здравствуйте, Jack128, Вы писали:

J>
J>DuplicateHandle(GetCurrentProcess, GetCurrentThread, GetCurrentProcess, MainThreadHandle, 0, False, DUPLICATE_SAME_ACCESS);
J>

Спасибо.

J>И вообще мне на другом форуме сказали, что этот поток основной, и убъешь его — завершишь приложение...

J>Нет — это не так.
J>Еще раз повторю — использовать TerminateThread — это очень, очень, ОЧЕНЬ плохо.
А как иначе? Если поток не оборвать, то будет работать до бесконечности.... ExitThread что-ли? А по флагу что-то я не врубился.

А>>(см мой первый ответ) а вот с ПОВТОРНЫМ запуском VCL потока я чесно говоря не сталкивался, но рискну предположить, что нужно создать его эмуляцию, то есть поток в методе Execute, которого будет что нить типа этого:


J>>>procedure TVCLThread.Execute;

J>>>begin
J>>> Application.Initialize;
J>>> Application.CreateForm(TMainForm, MainForm);
J>>> Application.Run;
J>>>end;

А>>>>бред полный... препод больной на голову...

J>>>Ну тот чтот это бред — это ясно.. А что не ясно — ты исполузуешь VCL и "организоваешь ФОРМУ" или вс таки на апи создаешь окно??

А>>Да могу и так и так — не принципиально. В данный момент хочу без винапи сделать. то есть крейт форм и т.д.

J>Ну давай.. О результатах потом расскажи..
А>>>>хотя с другой стороны даже интересно...
Re[2]: Threads.... Блин
От: шАПОГ Украина  
Дата: 18.09.04 01:29
Оценка:
Здравствуйте, BlackBox, Вы писали:

BB>Здравствуйте, RI, Вы писали:


RI>>в общем есть такая ситуация.


RI>>привожу код



RI>>То есть мне нужно, чтобы второй поток убил первый, но не получается. Какие есть варианты?


BB>Может у тебя не получается убить поток, потому что он является родительским для твоего второго потока.


А какая разница, кто создал какой поток? Да можно хоть все потоки в системе зарубить запрасто.
Copyright (C) Shapognilenko Inc. All rights reserved.
Warning: All of this is protected by copyright law and international treaties. Unauthorized reproduction or distribution of this may result in severe civil and criminal penalties.
Re[8]: Threads.... Блин
От: Leonid Troyanovsky  
Дата: 18.09.04 17:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Общая схема:

А>один поток организов. форму и генерирует рендомом числа
А>второй считывает числа из файла
А>когда число совпадает то активизируется третий поток
А>который разрушает первые два и предлагает или выйти
А>или снова их запустить...

Оная схема реализуема при условиях:
1) третий поток есть главный поток
2) "форма" есть окно, созданное простым CreateWindow

Однако, нет никакого смысла в ее реализации, потому как
1) поток организов. форму и генерирующий случ.числа нуждается в синхронизации с
потоком, считывающим числа из файла. Пусть, например, это будет ответ на
SendMessage(Wnd, WM_USER, 0, 0). Тогда "визуальный" поток будет в основном
занят этими ответами в ущерб юзеровскому вводу, а два потока будут работать
как один (сравни со случаем, когда второй поток сам генерирует случ.числа)
2) третий поток и вовсе надуман, т.к. если второй поток нашел совпадение,
то он может завершиться сам (вполне естественно) и завершить первый.
3) поставленная задача (если она имеет хоть какой-то утилитарный смысл)
элементарно решается в однопоточной VCL схеме.

Ну, а преподу дай почитать Джефа Рихтера, чтоб не маялся дурью.
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.