Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1148538756
VitV
2006-05-25 10:32
2006.06.11
Разработка компонент.


15-1147625369
Сумашедший художник
2006-05-14 20:49
2006.06.11
А вы говорите Фотошоп...


4-1142354826
Volf_555
2006-03-14 19:47
2006.06.11
Как изменить UIN и пароль в QIP?


2-1148724673
Id
2006-05-27 14:11
2006.06.11
Параметр "Вычислить как..."


6-1139092207
Galiaf
2006-02-05 01:30
2006.06.11
Узнать о кампьютерах в сети. Sockets.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский