|
Модераторы: Daevaorn |
|
Blade |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 99 Регистрация: 8.7.2002 Репутация: нет Всего: нет |
Необходимо сделать следующее: после того как появляется диалоговое окно, должен быть запущен модуль даунлоада, при этом должен ползти ползунок. Всё вроде просто, а проблема в следующем: при описании этого модуля в OnInitDialog() он запускается раньше, чем появляется диалоговое окно, т.е. сначало он завершит работу, затем окно появится. Кто знает, где нужно описать этот модуль?
Заранее спасибо. |
|||
|
||||
suborg |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
сделай отдельным трэдом - вообще зашибись будет.
CreateThread почитай. Или можешь на таймер повесить OnTimer() в методах диалога. |
|||
|
||||
Blade |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 99 Регистрация: 8.7.2002 Репутация: нет Всего: нет |
Почитал я в MSDN о CWinThread::CreateThread(...). Честно говоря, не очень понял, как им пользоваться. А по-поводу второго варианта, мне кажется это как-то неправильно, даже смешно. Всё равно спасибо.
|
|||
|
||||
Temnozor |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 134 Регистрация: 27.6.2002 Где: Тюмень Репутация: нет Всего: нет |
Диалог всегда появляется после того, как завершается функция OnInitDialog(). Это своего рода конструктор диалога (хотя это не совсем так). Так что, если хочешь что-то увидеть расчеты/отрисовки должны быть в другой функции.
--------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound. |
|||
|
||||
Seregy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 30.7.2002 Репутация: нет Всего: нет |
AfxBeginThread
Пример дать или сам MSDN посмотришь? |
|||
|
||||
Blade |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 99 Регистрация: 8.7.2002 Репутация: нет Всего: нет |
В МСДНе посмотрел пример, но опять-таки не вьехал, почему в параметре AfxBeginThread передаём класс, в котором описан метод этого класса. Собственно у меня и задач, состоит только в том, чтобы как только появится окно, запустить метод этого самого класса, описывающего диалог.
|
|||
|
||||
suborg |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Без потоков ничего не получится.
Дело в том, что когда ты из основного потока своей программы запускаешь какую либо свою функцию или метод, то весь поток утекает в эту функцию, и пока он обратно не вытечет, окно вообще не будет жить. Не будет перерисовываться, реагировать на клавиатуру и мышку и т.п. потому что функция обработки сообщений, приходящих в окно находится в том же потоке. Поэтому чтобы выполнялась какая-то задача беспрерывная, а её статус выводился в окно, задача должна работать в отдельном потоке. По-правильному надо, конечно, AfxBeginThread, но в принципе можно просто CreateThread. Выглядеть будет примерно так: глобальная функция DWORD WINAPI LThread(LPVOID lpParameter); ля ля тополя, определили эту функцию и т.п., дальше внутри диалога: DWORD lThread=0; CreateThread(NULL,0,LThread,NULL,0,&lThread); соответственно после CreateThread появится новый поток, который будет работать параллельно основному. Тут придется обратить внимание на синхронизацию потоков, завершение и т.п. |
|||
|
||||
Blade |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 99 Регистрация: 8.7.2002 Репутация: нет Всего: нет |
А не проще-ли к диалоговому окну привезать обработчик события, которое происходит, когда диалоговое окно показывается на экране. Кокое - не знаю. Перебрал кучу: и WM_CREATE и WM_SHOWWINDOW и т.д. Все почему-то происходят до того как, окно показывается на экране.
|
|||
|
||||
Blade |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 99 Регистрация: 8.7.2002 Репутация: нет Всего: нет |
Это не есть проблема, всё и так работает, только для этого нужно после появления диалога нажать кнопочку "Скачать" А мне нужно просто без кнопочки. |
|||
|
||||
Temnozor |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 134 Регистрация: 27.6.2002 Где: Тюмень Репутация: нет Всего: нет |
Дак тогда пиши рабочий код вне класса диалога! И сделай диалог с прогрессом закачки немодальным. --------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound. |
||||
|
|||||
Grey |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 91 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
В конце обработчика WM_PAINT напиши, не ошибешься
Только без дополнительного процесса ползунок ползти все равно не будет |
|||
|
||||
Temnozor |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 134 Регистрация: 27.6.2002 Где: Тюмень Репутация: нет Всего: нет |
И вообще не обязательно самому создавать отдельный поток. В MFC есть специальный класс CProgressCtrl. Сам заботится о перерисовке.
--------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound. |
|||
|
||||
Temnozor |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 134 Регистрация: 27.6.2002 Где: Тюмень Репутация: нет Всего: нет |
Будет! Пишешь RedrawWindow() и усе! Перерисует и обновит. --------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound. |
|||
|
||||
Grey |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 91 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Не будет
Штука то, насколько я понял, примерно такая: в определенном событии диалога вызывается функция или компонент, не важно, которая качает файл и пока файл не скачаестся событие не завершится, поэтому диалог другие события обрабатывать не будет в том числе и WM_PAINT. А вот если скачивание работает в отдельном процессе, то оно может переодически сообщать тому же прогресу, что скачалось уже что-то. А сам по себе CProgressCtrl ничем не поможет. |
|||
|
||||
Blade |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 99 Регистрация: 8.7.2002 Репутация: нет Всего: нет |
Даже смешно, какая полемике разгорелась тут. Правда вот и выход нашёлся в конце концов. У меня всё заработало. Фишка была в следуёщем: во-первых я использовал класс CProgressCtrl, во-вторых качалось много небольших файлов, поэтому ползунок менялся по одному файлу, в третьех я просто не сообразил насчёт WM_PAINT'а В общем, огромное СПАСИБО всем, кто принимал участие в этих спорах и рассуждениях.
|
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |