Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.10;
Скачать: [xml.tar.bz2];

Вниз

Проблема с созданием окна(CreateWindow) в отдельном потоке   Найти похожие ветки 

 
sc0rp   (2009-03-24 10:10) [0]

Здравствуйте. Возникла следующая проблема с фунцией CreateWindow:
в основном приложении создается новая форма в одтельном потоке

 TProcessForm.Process_Show(self,"test",Image1.Picture.Bitmap);
 for I := 0 to 10 do
 begin
   sleep(100);
 end;

TProcessForm.Process_Show(self,"test",Image1.Picture.Bitmap) создает эту форму.
код создания формы:

wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="WinMin : Main";
RegisterClassEx(wc);

........
MainWnd:=CreateWindow(  "WinMin : Main",
                       "Win Min",
                       wS_POPUP or WS_DLGFRAME,
                       xPos,
                       yPos ,
                       nWidth,
                       nHeight,
                       //0,
                       HWNDparent,
                       0,
                       Hinstance,
                       nil
                       );
........
InvalidateRect(MainWnd,nil,false);
ShowWindow(MainWnd,CmdShow);
UpdateWindow(MainWnd);

Проблема в следующем: если HWNDparent<>0(тоесть создавать дочернюю форму)то при выполнении ShowWindow(MainWnd,CmdShow) управление передается из потока в основное приложение на выполнение цикла и только после завершения цикла поток продолжает работу, выполняет ShowWindow(MainWnd,CmdShow),UpdateWindow(MainWnd) и отображает созданное окно.Если создавать главное окно(HWNDparent=0) все работает нормально, окно создается параллельно работе основного приложения. В чем может быть причина? Мне нужно именно дочернее окно.


 
Сергей М. ©   (2009-03-24 12:33) [1]


> В чем может быть причина?


В том что доч.окно создано в другом потоке


 
sc0rp   (2009-03-24 15:38) [2]


>
> > В чем может быть причина?
>
>
> В том что доч.окно создано в другом потоке
>

это я понял. а как это победить?


 
Сергей М. ©   (2009-03-24 15:59) [3]


> управление передается из потока в основное приложение на
> выполнение цикла


Какого цикла ?


 
sc0rp   (2009-03-26 22:45) [4]


> Какого цикла ?

for I := 0 to 10 do
begin
  sleep(100);
end;


 
Сергей М. ©   (2009-03-27 08:41) [5]

А что это за бестолковый цикл ?
Где он размещен и для каких целей ?


 
brother ©   (2009-03-27 08:46) [6]

> for I := 0 to 10 do
> begin
>  sleep(100);
> end;

ну, напиши вместо всего этого sleep(1000), может поможет?)


 
clickmaker ©   (2009-03-27 14:10) [7]

> for I := 0 to 10 do
> begin
>  sleep(100);
> end;

напомнило "как индусские программисты узнают завтрашнюю дату:
Sleep(24*60*60*1000);
TomorrowDate := Date;


 
sc0rp   (2009-03-27 23:49) [8]

Уважаемые мастера, для самых умных и остроумных поясню. Это фрагмент тестового проекта. Окно ,создаваемое в отдельном потоке, показывает, что приложение выполняет какую-либо процедуру(это может быть обращение к бд на выполнение хранимой процедуры, обработка даных внутри циклов). Цикл,в данном случае эмулирует подобную деятельность. Попробую обьяснить более доходчиво.
основное приложении вызывается
TProcessForm.Process_Show(self,"test",Image1.Picture.Bitmap);
и продолжает свою работу.
Process_Show создает новое окно в отдельном потоке, которое показывает,что основное приложение не висит а что-то делает. создание этого окна по-моему показано достаточно полно. Еще раз описываю проблему.
Поток нормально начинает работать параллельно с основным приложением, но в момент выполнения ShowWindow(MainWnd,CmdShow);(CmdShow:=WS_SHOWNORMAL) если HWNDparent<>0 управление предается в основное приложение, выполнение потока прерывается, и только после того, как приложение завершит свою работу(в данном случае цикл), поток продолжает выполнение и отображает окно. Есть какие-то конструктивные предложения по этому поводу?
P.S.

>  напомнило "как индусские программисты узнают завтрашнюю
> дату:
> Sleep(24*60*60*1000);
> TomorrowDate := Date;

с таким остроумием срочно в аншлаг.


 
Германн ©   (2009-03-28 00:24) [9]


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

Смахивает на бред.
Вот когда доппоток создаётся для выполнения каких-то длительных процессов, а основной поток показывает, что приложение не подвисло, это вполне естественный вариант. А тут всё наоборот?


 
sc0rp   (2009-03-28 00:38) [10]


> А тут всё наоборот?

Именно. Все наоборот. На то есть свои причины.


 
Германн ©   (2009-03-28 01:05) [11]


> sc0rp   (28.03.09 00:38) [10]
>
>
> > А тут всё наоборот?
>
> Именно. Все наоборот. На то есть свои причины.
>

Ну тогда ты первопроходец!
Вперёд с песнями. Если что-то получится, сообщи. Похлопочем о выдвижении твоего решения на нобеля (ну или хотя бы шнобеля :).

P.S. Ну а "свои причины" равно как и собственно задачу скрываем.
Партизаны никогда не выдают свои ноухау! :)


 
sc0rp   (2009-03-28 11:02) [12]

Уважаемый Мастер Германн:
во первых вы ошибаетесь

> Ну тогда ты первопроходец!

покопавшись в интернете вы найдете подобное решение для подобной проблемы.
во вторых, если вам объяснение причин поможет ответить на поставленный вопрос, то объясняю. Большой программный комплекс, работает с бд. Много запросов на выполнение хранимых процедур. Изначально это окно было сделано с использованием VCL и при выполнении хранимой процедуры(может занимать много времени) vcl-ная форма подвисала, ожидая ответа от сервера.  Обращение к серверу было реализовано на BDE,часть уже переведено на ado c асинхронным выполнением запроса, большинство осталось без изменения. Создание окна в отдельном потоке позволяет решить проблему подвисания.

> Вот когда доппоток создаётся для выполнения каких-то длительных
> процессов, а основной поток показывает, что приложение не
> подвисло, это вполне естественный вариант.

переделывать весь комплекс не вариант.


 
sniknik ©   (2009-03-28 11:41) [13]

> покопавшись в интернете вы найдете подобное решение для подобной проблемы.
проблема у тебя, а копаться ему? :))) раз решение есть, и ты его видел, то просто его выполни. чего спрашивать то?

> переделывать весь комплекс не вариант.
если в основе извращенная логика (а судя по описанию так и есть), то вариантов то как раз и нет, это единственный верный путь. переделывать.
скажите спасибо тому кто заложил такую основу.

в нормальном варианте за интерфейс отвечает основной поток, а вот работу, длительные операции выносят в потоки.  никак не наоборот.


 
Slym ©   (2009-03-29 12:06) [14]

для нормального функционирования окна нужно обеспечить обработку мессаджей...
чтото типа
while GetMessage do DispatchMessage



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

Форум: "Начинающим";
Текущий архив: 2009.05.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1237987387
J.S.
2009-03-25 16:23
2009.05.10
принадлежит ли значение набору


6-1203057413
WebSQLNeederr
2008-02-15 09:36
2009.05.10
Как удалить весь текст из хтмл, но сами теги оставить?


4-1209159476
alexnmsk
2008-04-26 01:37
2009.05.10
Дозвон по модему


3-1220355857
Razrab7
2008-09-02 15:44
2009.05.10
NULL в Oracle и пустая строка в Delphi


15-1236596170
kolokol
2009-03-09 13:56
2009.05.10
Вопрос про Memo





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский