Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnInitDialog() или где? 
:(
    Опции темы
Blade
Дата 17.8.2002, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 8.7.2002

Репутация: нет
Всего: нет



Необходимо сделать следующее: после того как появляется диалоговое окно, должен быть запущен модуль даунлоада, при этом должен ползти ползунок. Всё вроде просто, а проблема в следующем: при описании этого модуля в OnInitDialog() он запускается раньше, чем появляется диалоговое окно, т.е. сначало он завершит работу, затем окно появится. Кто знает, где нужно описать этот модуль?
Заранее спасибо.
PM MAIL   Вверх
suborg
Дата 17.8.2002, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



сделай отдельным трэдом - вообще зашибись будет.
CreateThread почитай.
Или можешь на таймер повесить OnTimer() в методах диалога.
PM MAIL WWW ICQ   Вверх
Blade
Дата 18.8.2002, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 8.7.2002

Репутация: нет
Всего: нет



Почитал я в MSDN о CWinThread::CreateThread(...). Честно говоря, не очень понял, как им пользоваться. А по-поводу второго варианта, мне кажется это как-то неправильно, даже смешно. Всё равно спасибо.
PM MAIL   Вверх
Temnozor
Дата 19.8.2002, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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.
PM   Вверх
Seregy
Дата 19.8.2002, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 30.7.2002

Репутация: нет
Всего: нет



AfxBeginThread

Пример дать или сам MSDN посмотришь? :)
PM MAIL   Вверх
Blade
Дата 19.8.2002, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 8.7.2002

Репутация: нет
Всего: нет



В МСДНе посмотрел пример, но опять-таки не вьехал, почему в параметре AfxBeginThread передаём класс, в котором описан метод этого класса. Собственно у меня и задач, состоит только в том, чтобы как только появится окно, запустить метод этого самого класса, описывающего диалог.
PM MAIL   Вверх
suborg
Дата 19.8.2002, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



Без потоков ничего не получится.
Дело в том, что когда ты из основного потока своей программы запускаешь какую либо свою функцию или метод, то весь поток утекает в эту функцию, и пока он обратно не вытечет, окно вообще не будет жить. Не будет перерисовываться, реагировать на клавиатуру и мышку и т.п. потому что функция обработки сообщений, приходящих в окно находится в том же потоке.
Поэтому чтобы выполнялась какая-то задача беспрерывная, а её статус выводился в окно, задача должна работать в отдельном потоке.
По-правильному надо, конечно, AfxBeginThread, но в принципе можно просто CreateThread. Выглядеть будет примерно так:

глобальная функция
DWORD WINAPI LThread(LPVOID lpParameter);

ля ля тополя, определили эту функцию и т.п., дальше внутри диалога:

DWORD lThread=0;
CreateThread(NULL,0,LThread,NULL,0,&lThread);

соответственно после CreateThread появится новый поток, который будет работать параллельно основному. Тут придется обратить внимание на синхронизацию потоков, завершение и т.п.
PM MAIL WWW ICQ   Вверх
Blade
  Дата 19.8.2002, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 8.7.2002

Репутация: нет
Всего: нет



А не проще-ли к диалоговому окну привезать обработчик события, которое происходит, когда диалоговое окно показывается на экране. Кокое - не знаю. Перебрал кучу: и WM_CREATE и WM_SHOWWINDOW и т.д. Все почему-то происходят до того как, окно показывается на экране.   ???
PM MAIL   Вверх
Blade
Дата 19.8.2002, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 8.7.2002

Репутация: нет
Всего: нет



Цитата(suborg @ 19.8.2002, 15:47)
Поэтому чтобы выполнялась какая-то задача беспрерывная, а её статус выводился в окно, задача должна работать в отдельном потоке.

Это не есть проблема, всё и так работает, только для этого нужно после появления диалога нажать кнопочку "Скачать" :) А мне нужно просто без кнопочки.
PM MAIL   Вверх
Temnozor
Дата 19.8.2002, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 27.6.2002
Где: Тюмень

Репутация: нет
Всего: нет



Цитата(Blade @ 19.8.2002, 17:57)
Цитата(suborg @ 19.8.2002, 15:47)
Поэтому чтобы выполнялась какая-то задача беспрерывная, а её статус выводился в окно, задача должна работать в отдельном потоке.

Это не есть проблема, всё и так работает, только для этого нужно после появления диалога нажать кнопочку "Скачать" :) А мне нужно просто без кнопочки.

Дак тогда пиши рабочий код вне класса диалога!
И сделай диалог с прогрессом закачки немодальным.
--------------------
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.
PM   Вверх
Grey
Дата 19.8.2002, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



В конце обработчика WM_PAINT напиши, не ошибешься :)
Только без дополнительного процесса ползунок ползти
все равно не будет :)
PM MAIL   Вверх
Temnozor
Дата 19.8.2002, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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.
PM   Вверх
Temnozor
Дата 19.8.2002, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 27.6.2002
Где: Тюмень

Репутация: нет
Всего: нет



Цитата(Grey @ 19.8.2002, 18:26)
В конце обработчика WM_PAINT напиши, не ошибешься :)
Только без дополнительного процесса ползунок ползти
все равно не будет :)

Будет!
Пишешь 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.
PM   Вверх
Grey
Дата 20.8.2002, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



Не будет :)
Штука то, насколько я понял, примерно такая: в определенном событии диалога вызывается функция или компонент, не важно, которая качает файл и пока файл не скачаестся событие не завершится, поэтому диалог другие события обрабатывать не будет в том числе и WM_PAINT. А вот если скачивание работает в отдельном процессе, то оно может переодически сообщать тому же прогресу, что скачалось уже что-то. А сам по себе CProgressCtrl ничем не поможет.
PM MAIL   Вверх
Blade
Дата 20.8.2002, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 8.7.2002

Репутация: нет
Всего: нет



Даже смешно, какая полемике разгорелась тут. Правда вот и выход нашёлся в конце концов. У меня всё заработало. Фишка была в следуёщем: во-первых я использовал класс CProgressCtrl, во-вторых качалось много небольших файлов, поэтому ползунок менялся по одному файлу, в третьех я просто не сообразил насчёт WM_PAINT'а :) В общем, огромное СПАСИБО всем, кто принимал участие в этих спорах и рассуждениях.  :hehe  :hehe  :hehe  :hehe  :hehe  :hehe
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.