Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 не использовать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо