![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Threads [D7, WinXP]
P@vel © (2004-06-28 01:45:00)Вопросик такой. При трассировке программы, создающей новый поток выдаётся. Debuger fault notification "*.exe raised too many consecutive exeptions "breakpoint exeption at *******". Так должно быть или что-то не так ? Уж очень хочется делать отладку.
constructor TCore.Create;
begin
inherited Create;
Handle:= AllocateHWnd(WndProc);
TimerProcWND:= CreateThread(nil,0,@TCore.TimerThread,nil,CREATE_SUSPENDED,TimerThreadIdentifier);
SetThreadPriority(TimerProcWND,THREAD_PRIORITY_IDLE);
ResumeThread(TimerProcWND);
while GetMessage(Message,0,0,0) do
begin
DispatchMessage(Message);
end;
end;
Digitman (2004-06-28 14:49:00) [1]
> P@vel
в идеологии win32 есть множество незыблемых постулатов, о которых ты, видимо, не имеешь представления
Наиболее важные из них для конкретно интересующей тебя темы :
1. В прикладной программе тело подпрограммы, будучи вызванной синхронно, всегда исполняется в контексте того же трэда, в котором выполняется вызывающая подпрограмма
2. Трэд, создавший окно, становится его "владельцем". После создания окна данный трэд имеет право на выборку и ответственен за выборку и обработку сообщений, посылаемых окну откуда-либо. Ни один другой трэд в общем случае не имеет доступа к сообщениям, адресованным окну, созданному данным трэдом.
Digitman (2004-06-28 14:38:00) [2]
> P@vel (28.06.04 14:04) [3]
> в чём разница между функцией и методом обьекта(в конкретном
> случае).
ты ответь сначала на вопрос в [1]
у тебя ощутимый пробел в знаниях ООП и ObjectPascal как такового, и трэды (как "конкретный" пример) здесь вовсе ни при чем..
думаю, никаких серьезных аргументов в пользу отказа тобой от станд.класса, ОБЛЕГЧАЮЩЕГО программирование трэдов, у тебя не найдется .. если же иначе, то лучшим способом понять, как это делается, будет анализ кода класса TThread от самого Борланда - открываешь модуль classes.pas, ищешь реализацию метода TThread.Create() и внимательно изучаешь, что там и почему ... обо всем конкретно непонятом задаешь вопросы сюда, в форум, в порядке их возникновения
P@vel (2004-06-28 14:04:00) [3]
while GetMessage(Message,0,0,0) do
begin
DispatchMessage(Message);
end
Это часть рпограммы. Поэтому я подумал, что может такие сообщения возникают именно из-за этого куска кода. Где Один из потоков остонавливается.
type
TCore = class(TObject)
......
private
function TimerThread(Parameter: Pointer): Integer; stdcall;
......
end;
implementation
function TCore.TimerThread(Parameter: Pointer): Integer;
begin
end;
> Digitman ©
Объясни пожалуйста в чём разница между функцией и методом обьекта(в конкретном случае). Используют то они 1 адресное пространство.
Digitman (2004-06-28 09:49:00) [4]1. Ф-ция CreateThread() требует 3-м параметром адрес не метода объекта, а функции, которая должна иметь след.прототип :
TThreadFunc = function(Param: Pointer): Integer; stdcall;
2.
> while GetMessage(Message,0,0,0) do
> begin
> DispatchMessage(Message);
> end;
а это кому и зачем нужно ?
TUser (2004-06-28 09:28:00) [5]А почему бы TThread не использовать?