Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2013, 19:59   #1
slipp
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 21
Счастье обновление списка

Код:
static HWND hWndList;//дескриптор списка
int WINAPI WinMain(HINSTANCE hlnst,HINSTANCE,LPSTR,int)
{
  ... 
  try
  {
    boost::thread search(directory_traversal, p);//запускаю поток поиска, заполняю контейнер с результатами.

    DialogBox(hlnst, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);//рисую диалог
    search.join();//жду выполнения
  }
  catch(const filesystem_error&)
  {
    MessageBox(NULL, TEXT("ERRORRRRR"), TEXT("Error"), MB_OK);
  }
  //питаюсь обновить содержимое списка! Безрезультатно:
  ListView_RedrawItems(hWndList, 0, directory.size()-1);
  UpdateWindow(hWndList);
  return 0;
}
//диалоговая процедура где инициализирую hWndList и т. п.
BOOL CALLBACK DlgProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam)
{
  switch(msg)
  {
  case WM_INITDIALOG:
    {
      //инициализирую hWndList!, создаю список.
      hWndList= CreateWindowEx(0, WC_LISTVIEW, NULL,
        WS_CHILD|WS_BORDER|WS_VISIBLE|LVS_OWNERDATA|LVS_REPORT,
        20, 20, 670, 300, hwnd, NULL, hInstance,NULL);
    ...
    }
    ....
}//DlgProc
вопрос:
- почему нет обновления содержимого списка в WinMain.
- правилен ли ход моих мыслей и действия по обновлению списка?

Последний раз редактировалось slipp; 20.11.2013 в 20:03.
slipp вне форума Ответить с цитированием
Старый 20.11.2013, 20:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
почему нет обновления содержимого списка в WinMain
А почему ты не обновляешь в оконной процедуре? Почему в главном цикле? Ты ведь там получаешь полный список сообщений, и без разбора их пытаешься ListView_RedrawItems вызвать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2013, 20:24   #3
slipp
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 21
Счастье

поток собирает информацию (этот процес занимает значительное время!):
Код:
boost::thread search(directory_traversal, p);
пока он ее собирает

рисуется диалог:
Код:
DialogBox(hlnst, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);//рисую диалог
программа ждет... окончания заполнения контейнера
Код:
search.join();
после окончания сбора информации:

хочу обновить список и его содержимое:
Код:
ListView_RedrawItems(hWndList, 0, directory.size()-1);
  UpdateWindow(hWndList);
в этом случае где и как её обновить?
я склоняюсь к WinMain... но не получается, потому и спрашиваю...
slipp вне форума Ответить с цитированием
Старый 20.11.2013, 20:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
программа ждет... окончания заполнения контейнера
В главном потоке? О_о
Ты ведь его замораживаешь ожиданием. Или я не прав?
И потом в WinMain ловят сообщения, а не обрабатывают.
Мне кажется что эта процедура не место для отрисовки списка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2013, 20:37   #5
slipp
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 21
Счастье

Цитата:
Сообщение от Stilet Посмотреть сообщение
В главном потоке? О_о
Ты ведь его замораживаешь ожиданием. Или я не прав?
замораживаю после отрисоки диалога:
Код:
DialogBox(hlnst, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);
делаю так для того чтобы при запуске, так как:
поток собирает информацию (этот процес занимает значительное время!)

можно было видеть окно диалога... (хотя и пустое)

список которого потом хочу заполнить...

таков ход моих мыслей...

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мне кажется что эта процедура не место для отрисовки списка.
тогда где оно??

Последний раз редактировалось Stilet; 20.11.2013 в 20:57.
slipp вне форума Ответить с цитированием
Старый 20.11.2013, 20:59   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
можно было видеть окно диалога... (хотя и пустое)
Ну так оно зависнет. Пользователь подумает что все и вышибет из диспетчера задач
Я бы так и сделал.
Цитата:
тогда где оно??
Я не спец по винапи, но думаю что где-то в оконной процедуре.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2013, 21:06   #7
slipp
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 21
По умолчанию

это плохо
slipp вне форума Ответить с цитированием
Старый 20.11.2013, 22:43   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Передайте в поток HWND окна. По завершении сбора информации пусть поток пошлет сообщение в окно, на предмет "сбор данных закончен".
Соотвественно join() убираем.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление списка по полю Елена Гох Microsoft Office Access 2 18.02.2011 12:35
Автоматическое обновление вспл.списка. stas77 Microsoft Office Excel 16 27.10.2009 11:39
Обновление списка TStringList eXa Компоненты Delphi 3 11.08.2007 16:24