Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посоветуйте метод прорисовки окна 
:(
    Опции темы
triclosan
Дата 21.8.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть Dialog based приложение, из которого читается файл. При этом приложение выжирает все доступные ресурсы процессора во время открытия при этом GUI подвисает и ProgressBar, показывающий степень открытия не отображается. Единственное, что приходит в голову вызывать по таймеру OnPaint(), правда не помогает.

Буду очень признателен совету.
PM MAIL   Вверх
xTr1m
Дата 21.8.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если я правильно понял вопрос (то есть у тебя все подвисает =)), то:
посмотри, как происходит чтение файла. Очень часто, просто там случается зацикливание, хотя ты думаешь, что все должно быть легко. Не факт, конечно, что поможет, но ты все равно сначала проверь.
PM MAIL WWW ICQ   Вверх
triclosan
Дата 21.8.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xTr1m @  21.8.2006,  16:56 Найти цитируемый пост)
Если я правильно понял вопрос (то есть у тебя все подвисает =)), то:
посмотри, как происходит чтение файла. 


У меня происходит чтение и индексирование файлов, размер которых несклько GB. Делается это построчно циклом while поэтому высокая загрузка системы имхо вполне логична. Проблема в том, что мне надо часть используемых ресурсов перекинуть на отрисовку окна с ProgressBar-ом.
PM MAIL   Вверх
xTr1m
Дата 21.8.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Точно не уверен, но может попробовть сделать потоком?
Скажем рабочий поток будет читать файл и у него будет какой-нибудь флаг о том, насколько он выполнен. А в соответствии с этим флагом в обчном режиме будет происходить отрисовка прогресс-бара
PM MAIL WWW ICQ   Вверх
triclosan
Дата 21.8.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xTr1m @  21.8.2006,  17:47 Найти цитируемый пост)
Точно не уверен, но может попробовть сделать потоком?


Спасибо, но что-то очень громостко. Ведь то, что имеем дело с открытием файла не принципиально, это может быть любая, жрущая ресурсы операция (например, подсчет числа Пи и т.п.). Должны же быть методы оставить 2-3% процессорных ресурсов на прорисовку окна.  
PM MAIL   Вверх
Earnest
Дата 22.8.2006, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



И как ты себе это представляешь, если все должно выполняться в одном потоке? Ты понимаешь, что такое поток управления? Вот идет твой цикл while, и пока ты из него не выйдешь, ничего другого (в рамках потока) выполняться не может. Либо предусматривай вставки внутри while (типа PeekMessage-DispathMessage), либо читай в потоке.
То же самое относится к любой "жрущей ресурсы" операции. 


--------------------
...
PM   Вверх
triclosan
Дата 22.8.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Earnest @  22.8.2006,  07:21 Найти цитируемый пост)
Ты понимаешь, что такое поток управления?

Если чесно, не особо smile . 

Цитата(Earnest @  22.8.2006,  07:21 Найти цитируемый пост)
либо читай в потоке.

А нельзя ли в двух словах как это делают?
PM MAIL   Вверх
Dart
Дата 22.8.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



triclosan, все сообщения MFC обрабатываются в основном потоке приложения, в т.ч. WM_PAINT, WM_COMMAND (специально выделил эти два). Так вот, если ты из обработки сообщения (например, кнопку нажал) вызываешь долгую обработку, то пока ты не выйдешь из этого обработчика, НИ ОДНОГО ДРУГОГО сообщения обработано не будет. Т.е., проще говоря, WM_PAINT (запрос рисования) приходить-то будет, но обрабатываться - нет, а только поставится в очередь сообщений. Поэтому, создание другого потока - единственная возможность.

Добавлено @ 10:29 
Цитата(triclosan @ 22.8.2006,  10:19)
Цитата(Earnest @  22.8.2006,  07:21 Найти цитируемый пост)
Ты понимаешь, что такое поток управления?

Если чесно, не особо smile . 

Цитата(Earnest @  22.8.2006,  07:21 Найти цитируемый пост)
либо читай в потоке.

А нельзя ли в двух словах как это делают?

MSDN и поиск рулит!
В двух словах - описываешь либо глобальную функцию потока, либо RUNTIME CLASS и вызываешь
Цитата

CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
);
CWinThread* AfxBeginThread(
   CRuntimeClass* pThreadClass,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
);

Но про потоки лучше сначала почитай, там много тонкостей smile
Вот здесь
Удачи
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 22.8.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Dart @  22.8.2006,  11:24 Найти цитируемый пост)
 все сообщения MFC обрабатываются в основном потоке приложения

Строго говоря нет. Можно создать несколько интерфейсных потоков. Но важно то, что обработка сообщения всегда происходит в том потоке, которому принадлежит окно, откуда бы это сообщение не пришло. 
Так что в принципе все верно описано. 
О потоках действительно в двух словах не скажешь, нужно самому почитать, разобраться.


--------------------
...
PM   Вверх
triclosan
Дата 22.8.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dart и Earnest спасибо ребята! Кое-что получилось, но не полностью.

1) Функция должна быть глобальной либо static методом класса. Не в том не в другом случае я не могу обратиться к членам и методам класса MyClassDlg из котрого я ее вызываю. Как это сделать? 

2) Я делаю так:

Код
void MyClassDlg::OnOpen() 
{
        AfxBeginThread(proc1,this,THREAD_PRIORITY_NORMAL);
                
        Indexing();
}

UINT MyClassDlg::proc1(LPVOID pParam)
{

for(;;)
{
    AfxMessageBox("2");
    Sleep(3000);
}

    return 0;
}


При этом месседжбоксы начинают появляться только по завершении выполнения Indexing(). Догадываюсь, что должно помочь вызывание Indexing() в отдельном потоке, хотя не логично...
PM MAIL   Вверх
Dart
Дата 22.8.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Самый простой способ получить контроль над каким-либо объектом в потоке, передать его в качестве параметра
еще раз:
Цитата(Dart @  22.8.2006,  10:24 Найти цитируемый пост)
   LPVOID pParam,

Вот это то, что тебе надо.
Функция не обязательно должна быть описана как static или глобальная.
Второй метод вызова потока - с использованием RUNTIME CLASS - только учти, что сам объект класса создается именно при старте потока. Такой метод очень удобен, когда надо вызвать, например, немодальный диалог, в котором данные обрабатываются независимо от основного приложения. При этом убивать поток надо тоже в этом классе.

Цитата(triclosan @  22.8.2006,  17:51 Найти цитируемый пост)
Догадываюсь, что должно помочь вызывание Indexing() в отдельном потоке, хотя не логично...

Поставь Sleep перед Indexing - а лучше ПОЧИТАЙ ПРО ПОТОКИ!
2 Earnest, 
Цитата(Earnest @  22.8.2006,  13:34 Найти цитируемый пост)
Можно создать несколько интерфейсных потоков. Но важно то, что обработка сообщения всегда происходит в том потоке, которому принадлежит окно, откуда бы это сообщение не пришло. 

Я исходил из того, что чел своих потоков не создавал. Я исходил из того, что в MFC основное окно принадлежит одному потоку и все мессаги сыплются именно в него smile

Это сообщение отредактировал(а) Dart - 22.8.2006, 18:10
--------------------
ЦитатаЛюблю смотреть, как другие работают
 Дж. К. ДжеромСайт: www.ecosigma.ruПочта: [email protected] 
PM MAIL WWW ICQ   Вверх
triclosan
Дата 29.8.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вобщем сделал так:

все-таки создал static метод класса МyClassDlg вызываю таким путем 
Код

AfxBeginThread (proc1, _param, THREAD_PRIORITY_TIME_CRITICAL);

обращаюсь к методам класса МyClassDlg путем компонента http://www.codeproject.com/threads/memberthread.asp 

На моей машине все отлично работает, а на некоторых других вылетает с ошибкой при закрытии потока. Поток закрываю путем возвращения "0" функцией UINT МyClassDlg::proc1. Могут ли ошибки на других машинах быть вызваны опцией THREAD_PRIORITY_TIME_CRITICAL? Если нет, то чем smile ? Создаю поток proc1 из потока окна, может надо создавать раньше?...

Возможно, надо использовать на других машинах "мои" Dll-ки? Только вопрос - все, что юзает приложение или только некоторые smile ...

Может кто-то даст ссылки, на то как можно использовать дамп памяти ошибки.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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