Вниз
Скачать: CL | DM;

Недопустимый дескриптор окна   Найти похожие ветки 

 
Alex_C   (2007-10-22 10:48) [0]

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

// Процедура вызываемая при получении очередной порции данных
// для изменения кол-ва скачанных данных
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 10:50) [1]


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


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


 
Alex_C   (2007-10-22 10:54) [2]

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


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


> Alex_C   (22.10.07 10:54) [2]


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


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


> Alex_C   (22.10.07 10:54) [2]

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


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

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


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

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


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


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


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


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

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


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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
2-1193234037
NewestAlex
2007-10-24 17:53
2007.11.18
TUpDown +не целые значения


2-1193065535
@!!ex
2007-10-22 19:05
2007.11.18
Float To Str & Decimal Separator


15-1192398990
Petr V. Abramov
2007-10-15 01:56
2007.11.18
как запрораммировать на Delphi


5-1163327689
Poisent
2006-11-12 13:34
2007.11.18
Помогите с редактором свойств.


6-1174411919
***(H@kker)***
2007-03-20 20:31
2007.11.18
Как написать сервер на Delphi типа Apach




   Наверх