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

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

Недопустимый дескриптор окна [D7, XP]


Alex_C ©   (2007-10-22 10:48:00) 

Возникает следующая проблема: полачаю данные из инета в отдельном треде. При получении данных делаю следующее:

// Процедура вызываемая при получении очередной порции данных
// для изменения кол-ва скачанных данных
procedure DLProc( RcvByte: Integer );
begin
   MainForm.WaitPanel.Caption := 'Download: ' + IntToStr(RcvByte) + ' bytes';
   MainForm.WaitPanel.Refresh;
end;

// Собственно сама нить:

procedure TGetThread.Execute;
begin
   FreeOnTerminate := True;
   try
       EnterCriticalSection( CS );

       MainForm.DownloadButton.Enabled := False;

       GetsData := TStringList.Create;

       MainForm.WaitPanel.Visible := True;
       MainForm.WaitPanel.Refresh;

       GetsData.Text := HTTPGet( GetStr, 'GET', '', DLProc );

       GetsData.SaveToFile('C:\ReceiveData.txt' );
   finally
       MainForm.WaitPanel.Visible := False;
       GetsData.Free;
       MainForm.DownloadButton.Enabled := True;
       LeaveCriticalSection( CS );
   end;
end;

Так вот, при выходе из проги, если б хотя бы раз вызывалась эта нить, возникает ошибка:
Exception EOSError:
System Error: Code 1400
Недопустимый дескриптор окна.

Если нить не запускать, прога естественно нормально завершается. Все качает и отображаетка как надо.
Вопрос: почему так происходит?


Сергей М.   (2007-10-22 15:52:00) [1]

Показывай код


Alex_C   (2007-10-22 15:39:00) [2]

В общем я не правильно выразился :)
Если форму окна не трогать - все работает и циферки скачанный байт бегут. Если переместить  форму по экрану, то она перестает перерисовываться - т.е. циферки застывают в том положении, в котором я начал перемещать форму и по краям пормы появляется белое поле, хотя скачивание происходит и дальше и затем, когда все скачивается (завершается работа нити), форма становится нормального вида.


Сергей М.   (2007-10-22 11:22:00) [3]


> программа зависает


Что сие значит ?


Alex_C   (2007-10-22 11:18:00) [4]

Теперь появилась следующия проблема:
если окно программы не трогать - все работает без проблем, а вот если попытаться его передвигать - то само окно не перерисовавыется, счетчик скачанных байт перестает изменяться и программа зависает.
Как вот такое поведение программы побороть?


Alex_C   (2007-10-22 11:03:00) [5]

Ок! Все разобрался! Всем спасибо!


Сергей М.   (2007-10-22 10:58:00) [6]


> Alex_C   (22.10.07 10:54) [2]


воспользоваться методом TThread.Synchronize()


Рамиль   (2007-10-22 10:58:00) [7]


> Alex_C   (22.10.07 10:54) [2]

А комментарии при создании модуля потока смотрели? Там не просто так написано..


Alex_C   (2007-10-22 10:54:00) [8]

Да все понял. Всему виной строки
MainForm.WaitPanel.Visible := True;
и
MainForm.WaitPanel.Visible := False;
А как же мне сделать, чтоб верно было?


Сергей М.   (2007-10-22 10:50:00) [9]


> почему так происходит?


Потому что обращение к визуальным VCL-контрола в доп.потоке недопустимо.


Наверх

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