Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для fabler
56 / 39 / 2
Регистрация: 18.09.2010
Сообщений: 39

VC++6.0, как из порожденного потока прочитать переменную главного потока?

05.10.2010, 13:14. Показов 3173. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Visual C++ 6.0 SP5
Простое диалоговое окно, (MFC) созданное мастером среды VC

По нажатию на кнопку создаю поражденный поток, в который передаю диспектор главного окна
в последствии в поражденном потоке шлю сообщения на главное окно
уже в главном потоке обробатываю сообщения

как в поражденном потоке в любой момент времени прочитать переменную главного потока?
ну к примеру, создаю поражденный поток, "вешаю" его в цикле с задержкой - постоянно проверяет изменилась ли строка char my_c[50]; если изменилась отправляю меседж главному окну

но вот саму my_c[50] хочу изменять в главном потоке, (считывать к примеру с объекта edit по нажатию на кнопку.


так вот как реалезовать что бы переменную можно было изменить в самом потоке и была возможность ее прочитать в поражденном?



вот код как создаю поток
загловочный файл класса диалога
C++
1
2
3
4
5
6
7
8
9
10
class CSimple_potokDlg : public CDialog
{
...
private:
        //функция обработки сообщения из поражденного потока
    LRESULT OnMyCoolMessage(WPARAM, LPARAM lp);
        //Создание потоковой функции
    static UINT __cdecl ThreadProc(LPVOID pParam);
    void write_to_log_list(char data[50]);//функция для вывода данных в главный лог лист
};



реализация класса
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
....
#define WM_MY_COOL_MESSAGE (WM_USER + 0x123)//для потока
 
....
 
BEGIN_MESSAGE_MAP(CSimple_potokDlg, CDialog)
    //{{AFX_MSG_MAP(CSimple_potokDlg)
    ...
        //иницализируем реакцию на сообщение из поражденного потока
    ON_MESSAGE(WM_MY_COOL_MESSAGE, OnMyCoolMessage)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
....
 
//потоковая функция
UINT CSimple_potokDlg::ThreadProc(LPVOID pParam)
{   
 
        //снова преобразование типов
        //получаем наш указатель на окно
    HWND hw = static_cast<HWND>(pParam);
 
        //для того что бы пихать сообщение в главный цикл
    static char pStr[50] = "Привет"; // ну или сколько тут надо....
 
    for(int i=1;i<=4;i++)
    {
        Sleep(500);//задержка
        //зная указатель окна, кидаем ему сообщение
        ::PostMessage(
            hw, //куда отправляем (по диспектору главного окна)
            WM_MY_COOL_MESSAGE, //какое сообщение 
            0, 
                //преобразуем в указатель на любой тип
            reinterpret_cast<LPARAM>(pStr)//который отправляем
        
        );//отправка сообщения
    }
return 0;
}//конец потоковой функции ThreadProc(LPVOID pParam)
 
 
 
//обробатываем пойманые сообщения в главном потоке
LRESULT CSimple_potokDlg::OnMyCoolMessage(WPARAM, LPARAM lp)
{
    write_to_log_list("поймали сообщение от поражденного потока");//подсказка
 
        //ASSERT - это макрос )
    //  Прерывает программу с указанием строки есть значение
    //  если содержимое скобок FALSE или = "0"
    ASSERT(lp);
 
 
        //преобразуем тип обратно для работы
    char* pStr = reinterpret_cast<char*>(lp);
    if (pStr){
        write_to_log_list(pStr);//заносим данные в лог лист
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2010, 13:14
Ответы с готовыми решениями:

Не получается с вторичного потока обратиться напрямую к объекту из главного потока
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к объекту из главного потока. WPF пока...

Многопоточность: вызвать метод главного потока из второстепенного потока
Здравствуйте. Эта тема всеми избита, знаю. Но у меня очень ограничено время, поэтому рискую и пишу вопрос тут: Пишу приложение...

UiThread, как вынести процесс из главного потока?
Я - новичок в Android. Нужно в этом куске кода реализовать многопоточность. Очистить главный поток от операций, связанных с соединением с...

10
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
05.10.2010, 14:07
передавать в
UINT CSimple_potokDlg::ThreadProc(LPVOID pParam)
pParam не хендл окна, а свою структуру (созданную в куче, а не на стеке), которая будет содержать все необходимые данные
1
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
05.10.2010, 17:22
Да можно и на стеке, указатель на нужные данные передавать, либо в главном потоке класс окна сделать синглтоном, например.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
05.10.2010, 17:31
Цитата Сообщение от Manjak Посмотреть сообщение
Да можно и на стеке
поток может работать гораздо дольше (а чаще всего это так и происходит), нежели ф-я его вызвавшая. Поэтому, если на стеке будет создан объект, то он самоудалиться при выходе из этой ф-ции, в результате поток будет обращаться к невалидным данным.
0
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
05.10.2010, 18:18
Я имею ввиду стек основного потока.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
05.10.2010, 19:11
Цитата Сообщение от Manjak Посмотреть сообщение
Я имею ввиду стек основного потока.
А кто вам сказал, что основной поток не может завершиться раньше порожденных?
В спецификации MFC такой оговорки нет.
0
 Аватар для fabler
56 / 39 / 2
Регистрация: 18.09.2010
Сообщений: 39
05.10.2010, 22:18  [ТС]
Вариант со структурой очень даже подходит,
а как это реализовать на практике?

я так и не понял как создать структуру приндлежащею классу да и еще (созданную в куче, а не на стеке)?

Добавлено через 2 часа 22 минуты
все вроде разобрался, создаю структуру в заголовке класса и тут же делаю ее копию (ну проекцию - в общем назнаючаю рабочий экземпляр), заполняю полученую структуру, и кидаю адрес на ее в поток &my_struct, в функции потока делаю снова экземпляр структуры и заполняю его по линку полученному при создании потока, вот данные и есть в потоке, считываю что нужно
а уже результат работы потока отсылаю меседжем в главный диалог и обробатываю в главном потоке, в общем задача реализованна

в чем разница между структурами (созданную в куче, а не на стеке) но главное се работаеть

всем большое спасибо за участие, оч помогли (^^,) в этой и прошлых моих темах.
0
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
05.10.2010, 23:26
Цитата Сообщение от Patch Посмотреть сообщение
А кто вам сказал, что основной поток не может завершиться раньше порожденных?
В спецификации MFC такой оговорки нет.
Основной поток виндового приложения запускается из BaseProcessStart, которая в свою очередь запускает crtstartup, которая при завершении вызвет ExitProcess, а в мфц ясно указывается, что для нормальной работы гуи вся обработка сообщений должна быть в одном потоке и это как правило основной поток. Еще аргументы?

ПС.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.10.2010, 12:05
Цитата Сообщение от Manjak Посмотреть сообщение
Еще аргументы?
Элементарно, Ватсон!
Где написано, что обработкой сообщений GUI должен заниматься главный поток?
Я сам сколько раз делал окно с отдельным потоком.
... ну, а ExitProcess вызывается, когда закрывается ПОСЛЕДНИЙ поток процесса(а вовсе не тот первый, запущенный BaseProcessStart) - вот ЭТО в MFC сказано совершенно конкретно.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
06.10.2010, 12:21
Цитата Сообщение от Patch Посмотреть сообщение
Я сам сколько раз делал окно с отдельным потоком.
это как? пример можно?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
06.10.2010, 14:55
Цитата Сообщение от oxotnik Посмотреть сообщение
это как? пример можно?
Стандартный цикл DispatchMessage/TranslateMessage работает независимо от того, в главном потоке он сделан, или нет.
Просто в MFC эта кухня скрыта от программистов.
Я - то с WinAPI начинал С++ учить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2010, 14:55
Помогаю со студенческими работами здесь

Как запустить метод в главном потоке из не главного потока?
Прив. У меня такая трабла, пишу клиент, для игры на одном движке, и если от сервера пришла какая-то определенная инфа, то мне необходимо...

Многопоточность. Как завершить неисполльзуемые потоки из главного потока
Привет. Буду рад любым идеям и замечаниям. Пишу многопоточный сокет сервер. Архитектура такая. Есть форма. На форме кнопка. Кнопка...

Как вызвать методы Unity вне главного потока?
Привет. У меня есть асинхронный сервер и клиент. И вся инфа, которая приходит от сервера к клиенту, обрабатывается в отдельном потоке, но...

Как вынести строку текста из BackGroundWorker в RichTextBox главного потока?
Всем доброго времени суток. У меня такой вопрос: Использую BackGroundWorker для опроса периферии. По ответам устройств составляется...

Как при завершении главного потока прерывать фоновые потоки?
При завершении главного потока фоновые прерываются. Как сделать?


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru