Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Ving
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 5
#1

Как сделать что б из потока выводились данные на листбокс - C++

28.04.2009, 14:25. Просмотров 1499. Ответов 12
Метки нет (Все метки)

Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma optimize ("", off)
ULONG WINAPI ServiceThread(PVOID lpParam)
{
 
    while(1)
    {
    Sleep(20);
    my_listbox2.AddString("progress");
    }
}
 
 
hThread=CreateThread(0,0x2000,ServiceThread,&my_listbox2/*&Cdialog_baseDlg*/,0,&Tid);       // Создаем и запускаем поток сбора данных
Как сделать так что б строка my_listbox2.AddString("progress"); работала что нужно передать в создании потока или чтото дописать в самом потоке ?? что б из потока выводились данные на листбокс который на диалоговом окне??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2009, 14:25     Как сделать что б из потока выводились данные на листбокс
Посмотрите здесь:

C++ Как прочитать данные из потока вывода другого процесса
C++ не могу считать из потока данные
C++ Как игнорировать ненужные данные из потока?
как сделать что бы когда нажал выбор кокого нить пункта, а он выделялся и с помощью Enter я подтверждаю что выбираю C++
Как сформировать из массива х массив y что бы елементы выводились в массиве до минимального значения? C++
C++ Как сделать так что бы не выбивала ошибку когда ввел не те данные
C++ Работа со строками ( сделать так, чтобы введенные символы с пробелом выводились в виде идентификаторов)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
28.04.2009, 14:29     Как сделать что б из потока выводились данные на листбокс #2
C++
1
2
3
4
5
6
7
8
9
10
11
hThread=CreateThread(0,0x2000,ServiceThread,(LPVOID)&my_li  stbox2,0,&Tid);
 
DWORD WINAPI ServiceThread(PVOID lpParam)
{
CListbox *my_listbox2 = (CListbox*)lpParam;
    while(1)
    {
            Sleep(20);
            my_listbox2->AddString("progress");
        }
}
ну и обращение к листбоксу лучше всего в критическую секцию заключить...
Ving
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 5
28.04.2009, 14:40  [ТС]     Как сделать что б из потока выводились данные на листбокс #3
Вставил а программу так как вы привели в примере матерится ...

Error 1 error C2065: 'CListbox' : undeclared identifier d:\soft\VS\C_Ivanov\dialog_base\dialog_base\dialog_baseDlg.cpp 62

Error 2 error C2065: 'my_listbox2' : undeclared identifier d:\soft\VS\C_Ivanov\dialog_base\dialog_base\dialog_baseDlg.cpp 62

Error 3 error C2059: syntax error : ')' d:\soft\VS\C_Ivanov\dialog_base\dialog_base\dialog_baseDlg.cpp 62

Error 4 error C2227: left of '->AddString' must point to class/struct/union/generic type d:\soft\VS\C_Ivanov\dialog_base\dialog_base\dialog_baseDlg.cpp 66

может я чтото где то не объявил или еще что ? запускаю поток по кнопке.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
28.04.2009, 14:43     Как сделать что б из потока выводились данные на листбокс #4
переменная my_listbox2 какого типа?
где этот тип прописан?
подключение заголовочника перед ф-ей потока прописано?
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
28.04.2009, 14:50     Как сделать что б из потока выводились данные на листбокс #5
Нельзя. Напрямую - никогда. Частая ошибка программистов на VC++/MFC, которая чревата появлением трудновоспроизводимых глюков.

А теперь подробности: CListBox является наследником CWnd, а к самому CWnd и ко всем его наследникам можно обращаться только и исключительно из того же самого потока, который их создал. Так уж устроена MFC. Она держит хэндлы всех окон в TLS потока.
Разумеется, обращаясь к окну из "чужого" потока, она попытается обратиться по "чужому" хэндлу. Что при этом произойдет - зависит от фазы луны. Может быть, в этот раз повезет и все сработает, как надо. Может быть, нет.

Что делать: из рабочего потока (ServiceThread) слать сообщения (PostMessage, но не SendMessage!) главному потоку приложения или главному окну, а там - их соответственно обрабатывать и писать что-то в Listbox.

Об этой особенности написано в литературе по MFC, только лень сейчас рыть.... Например, у Мешкова и Тихомирова в "Visual C++ и MFC".
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
28.04.2009, 14:54     Как сделать что б из потока выводились данные на листбокс #6
Цитата Сообщение от CheshireCat Посмотреть сообщение
Нельзя. Напрямую - никогда. Частая ошибка программистов на VC++/MFC, которая чревата появлением трудновоспроизводимых глюков.

А теперь подробности: CListBox является наследником CWnd, а к самому CWnd и ко всем его наследникам можно обращаться только и исключительно из того же самого потока, который их создал. Так уж устроена MFC. Она держит хэндлы всех окон в TLS потока.
Разумеется, обращаясь к окну из "чужого" потока, она попытается обратиться по "чужому" хэндлу. Что при этом произойдет - зависит от фазы луны. Может быть, в этот раз повезет и все сработает, как надо. Может быть, нет.

Что делать: из рабочего потока (ServiceThread) слать сообщения (PostMessage, но не SendMessage!) главному потоку приложения или главному окну, а там - их соответственно обрабатывать и писать что-то в Listbox.

Об этой особенности написано в литературе по MFC, только лень сейчас рыть.... Например, у Мешкова и Тихомирова в "Visual C++ и MFC".
Любой потомок от CWnd содержит в себе private m_hWnd - свой хендл, по которому с ним и работают.
При должной синхронизации проблем не должно возникать
Ving
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 5
28.04.2009, 14:56  [ТС]     Как сделать что б из потока выводились данные на листбокс #7
public:
CListBox my_listbox2;

у вас было написано CListbox исправил на CListBox откомпелировалось. Большое спасибо. Возникли еще несколько вопросов:

1. Вот это собственнно мы что сделали
CListBox *my_listbox2 = (CListBox*)lpParam; ?

2. Давлю на кнопку запуска потока вся система подвисает на некоторое время потом отвисает и начинается вывод вроди нормальный вывод. с этим подвисанием как то можно бороться?

3. у меня есть еще одна кнопка которая поидеи должна прекращать работу потока что б в листбоксе можно было чтото проанализировать... но чтото она не прекращает вывод в обработке кнопки написано следующее:

StopLDevice(&hIfc0); // Остановили сбор
CloseLDevice(&hIfc0);

CloseHandle(hThread); // Вот эта функция не остановливает работу потока?
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
28.04.2009, 15:03     Как сделать что б из потока выводились данные на листбокс #8
Цитата Сообщение от Ving Посмотреть сообщение
public:
CListBox my_listbox2;

у вас было написано CListbox исправил на CListBox откомпелировалось. Большое спасибо. Возникли еще несколько вопросов:

1. Вот это собственнно мы что сделали
CListBox *my_listbox2 = (CListBox*)lpParam; ?
приведение к нужному типу
Цитата Сообщение от Ving Посмотреть сообщение
2. Давлю на кнопку запуска потока вся система подвисает на некоторое время потом отвисает и начинается вывод вроди нормальный вывод. с этим подвисанием как то можно бороться?
надо весь код смотреть... из того что здесь выложено ничего конкретного сказать нельзя
Цитата Сообщение от Ving Посмотреть сообщение
3. у меня есть еще одна кнопка которая поидеи должна прекращать работу потока что б в листбоксе можно было чтото проанализировать... но чтото она не прекращает вывод в обработке кнопки написано следующее:

StopLDevice(&hIfc0); // Остановили сбор
CloseLDevice(&hIfc0);

CloseHandle(hThread); // Вот эта функция не остановливает работу потока?
самое простое - ввести какую нидь булеву переменную - флаг останова и цикл переписать
C++
1
2
3
4
while(flag)
{
.....
}
а из основного потока уже изменять эту переменную
что бы не плодить глобальные перменные в коде я обычно делаю структуру в которую запихиваю все флаги и объекты над которыми надо будет работать в потоке, и передаю в качестве параметра указатель на эту структуру
только здесь нужна будет весьма строгая синхронизация, дабы разные потоки одновременно не обращались к одному и тому же объекту.
Ving
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 5
28.04.2009, 15:14  [ТС]     Как сделать что б из потока выводились данные на листбокс #9
То есть я так понимаю приведение к нужному типу - смысл в том что эта строчка говорит о том что теперь когда мы будем обращаться к my_listbox2
после этой строки
CListBox *my_listbox2 = (CListBox*)lpParam; ?
мы будем ссылаться на тот указатель которы был передан потоку (LPVOID)&my_listbox2 так?

А что б вы мне чтото посоветовали по поводу подвисания потока что из кода нужно выложить?
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
28.04.2009, 15:16     Как сделать что б из потока выводились данные на листбокс #10
Цитата Сообщение от oxotnik Посмотреть сообщение
Любой потомок от CWnd содержит в себе private m_hWnd - свой хендл, по которому с ним и работают.
При должной синхронизации проблем не должно возникать
я уже нахлебался, разгребая кучи... хм... короче, кучи кода программистов, которые думали точно так же. Отнюдь не желаю тебе обидеть, но - горький опыт подтверждает мой постинг.

Впрочем, не настаиваю. Каждый сам кузнец своего несчастья.
Ving
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 5
28.04.2009, 15:20  [ТС]     Как сделать что б из потока выводились данные на листбокс #11
Цитата Сообщение от CheshireCat Посмотреть сообщение
я уже нахлебался, разгребая кучи... хм... короче, кучи кода программистов, которые думали точно так же. Отнюдь не желаю тебе обидеть, но - горький опыт подтверждает мой постинг.

Впрочем, не настаиваю. Каждый сам кузнец своего несчастья.
Ну а вы можете привести пример кода как бы вы сделали?
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
28.04.2009, 15:28     Как сделать что б из потока выводились данные на листбокс #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
я уже нахлебался, разгребая кучи... хм... короче, кучи кода программистов, которые думали точно так же. Отнюдь не желаю тебе обидеть, но - горький опыт подтверждает мой постинг.

Впрочем, не настаиваю. Каждый сам кузнец своего несчастья.
Хочу подчеркнуть: при должной синхронизации
PS: ну и CWinThread никто не отменял
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2009, 15:55     Как сделать что б из потока выводились данные на листбокс
Еще ссылки по теме:

C++ Как сделать массив, что бы данные НЕ вводились с клавиатуры, а уже БЫЛИ?
Как сделать что бы карты выводились рандомом? C++
C++ Как сделать чтобы в постфиксной записи кроме цифр выводились еще и обычные символы
Подскажите как сделать чтобы эти дроби не выводились, а записались в массив str1[100] C++
Как сделать так чтобы считывался пробел и не выводились несколько раз повторенные символы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,341
28.04.2009, 15:55     Как сделать что б из потока выводились данные на листбокс #13
Цитата Сообщение от Ving Посмотреть сообщение
Ну а вы можете привести пример кода как бы вы сделали?
Вот пример кода, выдранного из реального проекта: отображение прогресса операции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// в карте сообщений главного окна:
BEGIN_MESSAGE_MAP(CMyCoolAppWindow, CDialog)
    //....
    ON_MESSAGE(WM_SYNC_PROGRESS, OnSyncProgress)
END_MESSAGE_MAP()
 
// функция рабочего потока 
UINT SendFileFunc(LPVOID param)
{
    Data* pData = (Data*)param;
    if (pData)
    {
        // ....
        while (...)
        {
            // ....
            UINT percent = sent * 100.0 / pData->size;
            HWND hwnd = pData->hMainWnd;
            ::PostMessage(hwnd, WM_SYNC_PROGRESS, percent, 0);
        }
    }
    return 0;
}
 
// обновление прогресс-индикатора главного окна
LRESULT CMyCoolAppWindow::OnSyncProgress(WPARAM wParam, LPARAM)
{
    m_ProgressCtrl.SetPos(wParam);
    return 0;
}
Добавлено через 3 минуты 20 секунд
oxotnik, к сожалению, ни "должная синхронизация", ни CWinThread ничего не изменят. Приложение будет работать почти всегда. Почти. Вот только сбоить оно будет - именно при демонстрации заказчику...
Yandex
Объявления
28.04.2009, 15:55     Как сделать что б из потока выводились данные на листбокс
Ответ Создать тему
Опции темы

Текущее время: 20:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru