Текущий архив: 2006.06.11;
Скачать: CL | DM;
Вниз
Почему Thread1 останавливается ? Найти похожие ветки
← →
Kozz (2005-09-28 22:19) [0]Есть поток Thread1 и ф-ция Thread1Execute
function TForm1.Thread1_Execute(Sender: PThread): Integer;
begin
repeat
...
Sleep(100);
until ...
end;
В потоке реализуется анимация иконки в трее, но если в обработчике, например,
Button1Click организовать цикл:
fot i:= 1 to 100000 do ProgressBar1.Progress := round(i/1000);
то в это время поток "тормозится" (иконка в трее замирает)
цикл завершается и всё нормализуется (иконка "моргает" как надо)
вставка в цикл Applet.ProcessMessages(Ex) не помогла
как быть?
← →
ECM © (2005-09-29 13:15) [1]
> вставка в цикл Applet.ProcessMessages(Ex) не помогла
>
> как быть?
Добавить в цикл for одну из функций ожидания - Sleep, WaitForXXX и т.д.
которые позволят системе не загружать процессор на 100% (можно посмотреть в диспетчере задач) этим циклом - а дать возможность нормально выполняться другим потокам (и потоку Thread1Execute )
...
ProcessMessages, как можно убедится посмотрев в kol.pas, не содержит функций ожидания, позволяющих "отпустить" процессор.
← →
Kozz (2005-09-29 14:21) [2]а поподробнее про WaitForXXX, plz...
← →
ECM © (2005-09-29 14:30) [3]http://msdn.microsoft.com/library/en-us/dllproc/base/wait_functions.asp
← →
Kozz (2005-09-29 23:10) [4]спрашиваю, потому что со Sleep не работает
← →
Kozz (2005-09-30 20:15) [5]Может кто примером поможет?
Plz!!!!!!!!!!!!!!!!!
← →
homm © (2005-09-30 20:40) [6]У Thread есть два метода - Execute и Resume. Дак вот вам описание так сказать из первоисточника.
{* Executes thread. Do not call this method from another thread! (Even do
not call this method at all!) Instead, use Resume.
|<br>
Note also that in contrast to VCL, it is not necessary to create your
own descendant object from TThread and override Execute method. In KOL,
it is sufficient to create an instance of TThread object (see NewThread,
NewThreadEx, NewThreadAutoFree functions) and assign OnExecute event
handler for it. }
Какой метод используете ВЫ?
← →
Thaddy (2005-09-30 22:29) [7]Try reading about EVENT (win32 API event) in win32.hlp.
Otherwise I will give you a simple example. mail me, but only if necesary.
← →
Kozz (2005-10-01 18:54) [8]2homm
Thread1Execute
в нём циклrepeat ... until
сo Sleep
← →
Kozz (2005-10-01 18:56) [9]2homm
Thread1Execute
в нём циклrepeat ... until
сo Sleep
← →
Vladimir Kladov (2005-10-01 20:38) [10]анимация иконки в трее останавливается? работает это в итоге, вызывая Shell_NotifyIcon. MSDN: Shell_NotifyIcon
Sends a message to the taskbar"s status area. Врет. Используется не sendMessage, а PostMessage. Попробуйте заменить анимацию иконки простыми короткими бипами, для которых не требуется посылать сообщения.
← →
homm © (2005-10-01 21:37) [11]> Thread1Execute
Это что значит Thread1.Execute?
ТЫ ЧТО ЧИТАТЬ НЕ УМЕЕШ:
> Executes thread. Do not call this method from
> another thread! (Even do
> not call this method at all!) Instead, use RESUME.
Эксекьют не создает нити! Он выполняет OnExecute в нити, вызвавшей его.
← →
Kozz (2005-10-02 01:33) [12]ОК, но у меня возникает сразу три глупых вопроса:
1. Почему в примере DemoThread используется Thread1Execute?
function TForm1.Thread1Execute(Sender: PThread): Integer;
begin
StopThread := FALSE;
ThreadFinished := FALSE;
while not StopThread do
begin
Sleep( 1000 );
Beep( 1000, 100 );
end;
Result := 0;
ThreadFinished := TRUE;
end;
2. Предполагаю, что следующий код работать не будет:
procedure TForm1.Thread1Resume(Sender: PObj);
begin
StopThread := FALSE;
ThreadFinished := FALSE;
while not StopThread do
begin
Sleep( 1000 );
Beep( 1000, 100 );
end;
ThreadFinished := TRUE;
end;
собственно так оно и вышло, "висим"...
что не так?
3. Почему ProcessViewer показывает 2 потока, а не один, в котором "выполняется OnExecute в нити, вызвавшей его"?
← →
homm © (2005-10-02 05:40) [13]Да почему ты считаеш TForm1.XXXX методом PThread. Как ты запускаеш поток?
MyThread.Execute;
или
MyThread.Resume;
Я про это спрашивал :-[]
← →
Kozz (2005-10-02 12:04) [14]Resume (Thread1.Resume) из FormCreate
до этого он ждёт (startSuspended = TRUE)
Всё работает шикарно, до тех пор пока дело не доходит до цикла в Button1Click - см. [0]
2Kladov
Я пробовал, но и пищать тоже перестаёт :((
до окончания цикла
← →
Vladimir Kladov (2005-10-02 15:09) [15]Вот этот код
function TForm1.Thread1Execute(Sender: PThread): Integer;
var ico1, ico2: HIcon;
begin
ico1 := LoadIcon( hInstance, "I16" );
ico2 := LoadIcon( hInstance, "I17" );
while Sender.Tag=0 do
begin
TrayIcon1.Icon := ico1;
Sleep( 100 );
if Sender.Tag <> 0 then break;
TrayIcon1.Icon := ico2;
Sleep( 100 );
end;
Result := 1;
end;
procedure TForm1.Button3Click(Sender: PObj);
var i: Integer;
begin
for i := 1 to 100000 do
ProgressBar1.Progress := Round( i / 1000 );
end;
Иконка не перестает мигать!
← →
sergeych (2005-10-02 17:57) [16]Remarks
A thread can relinquish the remainder of its time slice by calling this function with a sleep time of zero milliseconds.
You have to be careful when using Sleep and DDE. If a thread creates any windows, it must process messages. DDE sends messages to all windows in the system. If you have a thread that uses a wait function with no time-out interval, the system will deadlock. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than Sleep.
← →
Kozz (2005-10-02 23:03) [17]2Kladov
Спасибо, попробую
Страницы: 1 вся ветка
Текущий архив: 2006.06.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.017 c