Проблемка Code: repeat Application.ProcessMessages; until false; грузит проц на 100%, а раньше такого не было (если было, то я свой дом труба шатал!) никто не сталкивался с такой проблемой? P.S. новый проект, на клике кнопки висит код, приведенный выше.
Цикл с Application.ProcessMessages мне кажется не очень удачным решением чего бы то ни было. чтобы не загружать процессор, добавь в цикл Sleep с небольшим числом.
Sleep с небольшим числом не катит т.к. в процессе этого вот цикла мне нужно обрабатывать много сообщений форме (если ставлю слип(10) форма тупо повисает) ______________________ за вроде бы как наказывают
ага.. наказывают ) тогда делай апдейт кампу... ставь проц которого так просто не загрузишь нагрузка на проц при Application.ProcessMessages; не только у тебя... он всегда грузить ЦП
Была такая же трабла, когда учился с OpenGL работать и окна с помощью WinAPI создавать. Вообще так делать нельзя, тут два варианта : 1. Поставить Sleep(1); Тогда не будет тормозить, но это тоже не верно. 2. Написать так : repeat Application.ProcessMessages; WaitMessage; until false; Тут грамотно, но если ты это делаешь синхронизированно с каким нить левым потоком - код встанет пока не придет любое сообщение, тут то как раз и первый вариант нужен.
В отдельный поток закидываешь обработку таких данных Там же sleep(10); В итоге и форма получает сообщения и поток обрабатывает данные не нагружая форму.
Что ты везде со своими плюсами ?Сам попрашайничаешь так и других подбиваешь. Если человек сочтет нужным, то отправит и без чьих-то указаний. Сорри за оффтоп.
Бред, обработку сообщений можно обрабатывать только в главном иначе если и не сразу, то потом будет карачун.
Может он имел в виду, что принимать сообщения нужно из главного потока, а делать обработку некоторых из них - в дополнительном.
На сколько я понял он имел в виду, что действия требующие задержки делать в отдельном потоке, а обрабатывать сообщения - в главном. На счет потоков я не знаю, но читал (поправьте, если ошибаюсь), что сообщения форма пересылает всем созданным объектам. поток - объект. т.е. чисто теоретически должно и потоку пересылаться. делаем у него процедуру procedure che_to_tam(var message:tmessage); message:WM_chee_to_tut; и все сообщения с идентификатором WM_chee_to_tut; обрабатываются потоком
Не совсем, вызываться метод потока с сообщением WM_chee_to_tut будет в контексе потока в котором вызывается обработка сообщений(Application.ProcessMessages) в левом потоке как раз нельзя вызывать обработку сообщений, потому что будут затронуты данные без синхронизации принадлежащий главному потоку, тобешь форму к примеру.
Что мешает создать В ОТДЕЛЬНОМ потоке новое окно и на него принимать сообщения ? PHP: function PlainWinProc(hWnd: THandle; nMsg: UINT; wParam, lParam: Cardinal): Cardinal; var Rect: TRect; begin Result := 0; case nMsg of wm_Create: sleep(1); wm_Command: sleep(1); wm_Destroy: sleep(1); else Result := DefWindowProc(hWnd, nMsg, wParam, lParam); end; end; procedure WinMain; var hWnd: THandle; Msg: TMsg; WndClassEx: TWndClassEx; begin // initialize the window class structure WndClassEx.cbSize := sizeOf(TWndClassEx); WndClassEx.lpszClassName := 'PlainWindow'; WndClassEx.style := cs_VRedraw or cs_HRedraw; WndClassEx.hInstance := HInstance; WndClassEx.lpfnWndProc := @PlainWinProc; WndClassEx.cbClsExtra := 0; WndClassEx.cbWndExtra := 0; WndClassEx.hIcon := LoadIcon(hInstance, MakeIntResource('MAINICON')); WndClassEx.hIconSm := LoadIcon(hInstance, MakeIntResource('MAINICON')); WndClassEx.hCursor := LoadCursor(0, idc_Arrow); ; WndClassEx.hbrBackground := GetStockObject(white_Brush); WndClassEx.lpszMenuName := nil; // register the class if RegisterClassEx(WndClassEx) <> 0 then begin hWnd := CreateWindowEx( ws_Ex_OverlappedWindow, // extended styles WndClassEx.lpszClassName, // class name 'Window', // title ws_OverlappedWindow, // styles 100, 100, // position 1, 1, // size 0, // parent window 0, // menu HInstance, // instance handle nil); // initial parameters if hWnd <> 0 then begin ShowWindow(hWnd, sw_ShowNormal); // тут показ окна если не нужен закоментировать while GetMessage (Msg, 0, 0, 0) do begin TranslateMessage (Msg); DispatchMessage (Msg); end; end; end; end;
> А копипастить всюду кусок говнокода Критикуя - предлагай! За наводку на AllocateHWnd спасибо, почитаю.
Толку...один фик обработка всегда в одном потоке обрабатывается. Нет разницы в каком потоке окно создаешь. P.S. AllocateHWnd не следует использовать если без VCL пишешь, т.к. это есть часть VCL, то есть потянет много чего не нужного, я просто писал аналог этой функции если уж на API писать.