Здравствуйте, 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 isinterpreted 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>То есть мне нужно, чтобы второй поток убил первый, но не получается. Какие есть варианты?
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
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
Лучше уж выставить какой-нибудь флаг, а в убиваемом потоке ждать, пока он не окажется выставлен, и тогда завершиться самостоятельно (читай — корректно).
Для VCL потока этот флаг Application.FTerminate, а выставить этот флаг можно методом Application.Terminate ...
Здравствуйте, 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>>Лучше уж выставить какой-нибудь флаг, а в убиваемом потоке ждать, пока он не окажется выставлен, и тогда завершиться самостоятельно (читай — корректно).
У меня есть два потока, в одном из которых форма.
Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два.
Здравствуйте, <Аноним>, Вы писали: А>У меня есть два потока, в одном из которых форма. А>Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два.
А форму ты тоже собираешься убить? По-моему, ты неправильно ставмшь задачу. Расскажи, зачем тебе это.
... << RSDN@Home 1.1.4 @@subversion >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Threads.... Блин
От:
Аноним
Дата:
17.09.04 13:21
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали: А>>У меня есть два потока, в одном из которых форма. А>>Но мне нужно, чтобы именно при определенных условиях запускался третий поток и уничтожал первые два. S>А форму ты тоже собираешься убить? По-моему, ты неправильно ставмшь задачу. Расскажи, зачем тебе это.
Да собираюсь убить
Потому что такое задание, мне оно конечно на фиг не надо, но сказали...
Общая схема:
один поток организов. форму и генерирует рендомом числа
второй считывает числа из файла
когда число совпадает то активизируется третий поток
который разрушает первые два и предлагает или выйти
или снова их запустить...
бред полный... препод больной на голову...
хотя с другой стороны даже интересно...
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 и "организоваешь ФОРМУ" или вс таки на апи создаешь окно??
Да могу и так и так — не принципиально. В данный момент хочу без винапи сделать. то есть крейт форм и т.д. А>>хотя с другой стороны даже интересно...
Здравствуйте, Аноним, Вы писали:
J>>Ну убить и запустить доп поток — это не проблема, да и убить поток VCL тооже не сложно А>да вот сложно. Как я понял, не получается у меня duplicatehandle() никак.
И вообще мне на другом форуме сказали, что этот поток основной, и убъешь его — завершишь приложение...
Нет — это не так.
Еще раз повторю — использовать TerminateThread — это очень, очень, ОЧЕНЬ плохо.
А>(см мой первый ответ) а вот с ПОВТОРНЫМ запуском VCL потока я чесно говоря не сталкивался, но рискну предположить, что нужно создать его эмуляцию, то есть поток в методе Execute, которого будет что нить типа этого:
J>>procedure TVCLThread.Execute; J>>begin J>> Application.Initialize; J>> Application.CreateForm(TMainForm, MainForm); J>> Application.Run; J>>end;
А>>>бред полный... препод больной на голову... J>>Ну тот чтот это бред — это ясно.. А что не ясно — ты исполузуешь VCL и "организоваешь ФОРМУ" или вс таки на апи создаешь окно??
А>Да могу и так и так — не принципиально. В данный момент хочу без винапи сделать. то есть крейт форм и т.д.
Ну давай.. О результатах потом расскажи.. А>>>хотя с другой стороны даже интересно...
Спасибо.
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>Ну давай.. О результатах потом расскажи.. А>>>>хотя с другой стороны даже интересно...
Здравствуйте, 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.
Здравствуйте, Аноним, Вы писали:
А>Общая схема: А>один поток организов. форму и генерирует рендомом числа А>второй считывает числа из файла А>когда число совпадает то активизируется третий поток А>который разрушает первые два и предлагает или выйти А>или снова их запустить...
Оная схема реализуема при условиях:
1) третий поток есть главный поток
2) "форма" есть окно, созданное простым CreateWindow
Однако, нет никакого смысла в ее реализации, потому как
1) поток организов. форму и генерирующий случ.числа нуждается в синхронизации с
потоком, считывающим числа из файла. Пусть, например, это будет ответ на
SendMessage(Wnd, WM_USER, 0, 0). Тогда "визуальный" поток будет в основном
занят этими ответами в ущерб юзеровскому вводу, а два потока будут работать
как один (сравни со случаем, когда второй поток сам генерирует случ.числа)
2) третий поток и вовсе надуман, т.к. если второй поток нашел совпадение,
то он может завершиться сам (вполне естественно) и завершить первый.
3) поставленная задача (если она имеет хоть какой-то утилитарный смысл)
элементарно решается в однопоточной VCL схеме.
Ну, а преподу дай почитать Джефа Рихтера, чтоб не маялся дурью.