Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AfxBeginThread, проблема с запуском функции 
:(
    Опции темы
lv151
Дата 29.6.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

LRESULT CDialog1::OK() 
{                
................
    AfxBeginThread(ThreadProc, NULL);    
        строка1
        строка2
       строка3
}




Запускаю под отладчиком, сначала проходят:
строка1
строка2
строка3
А только после этого ThreadProc.

PM MAIL   Вверх
jonie
Дата 29.6.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



ну и в чем проблема? С чего вы взяли что нить будет выполнена немедленно (оторвите руки тому, кто вам такое сказал)? Она будет выполнена тогда когда на это появится время, и будет полностю инициализирована. Поставьте Sleep(1000) после AfxBeginThread и все в большинстве случаев будет так как хочется Вам.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Earnest
Дата 29.6.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(jonie @  29.6.2009,  20:03 Найти цитируемый пост)
Поставьте Sleep(1000) после AfxBeginThread и все в большинстве случаев будет так как хочется Вам. 

Но тоже не обязательно, хотя и скорее всего. Но на 333 раз может произойти сбой. Если между потоками нужно обеспечить фиксированную очередность исполнения кусков кода, необходима синхронизация.



--------------------
...
PM   Вверх
lv151
Дата 30.6.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Запускается только один поток.
В функцию потока передаётся указатель на класс, delete для него срабатывает до того как запуститься функция потока.
PM MAIL   Вверх
jonie
Дата 30.6.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



и что вы хотите этим сказать нам?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lv151
Дата 30.6.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(jonie @  30.6.2009,  09:44 Найти цитируемый пост)
и что вы хотите этим сказать нам? 

Уже ничего. Появилась другая проблема.
В функцию потока передаю CListCtrl, при InsertString в него всё виснет. smile
PM MAIL   Вверх
Earnest
Дата 30.6.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Оболочки, производные от CWnd , валидны только внутри потока, где созданы. Не все, но некоторые MFC-функции будут ругаться. Но виснет у тебя, возможно, из-за какого-то deadlock'а. InsertString реализуется через SendMessage, а это дело в потоке вполне может вызвать взаимоблокировку.  Лучше всего 1) не работать с окнами в чужом потоке 2) если уж приспичило, передавай HWND и делай все манипуляции через API (по крайней мере, можно выбирать, какой функцией сообщение послать).


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


Опытный
**


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

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



Цитата(Earnest @  30.6.2009,  10:31 Найти цитируемый пост)
Оболочки, производные от CWnd , валидны только внутри потока, где созданы. Не все, но некоторые MFC-функции будут ругаться. Но виснет у тебя, возможно, из-за какого-то deadlock'а. InsertString реализуется через SendMessage, а это дело в потоке вполне может вызвать взаимоблокировку.  Лучше всего 1) не работать с окнами в чужом потоке 2) если уж приспичило, передавай HWND и делай все манипуляции через API (по крайней мере, можно выбирать, какой функцией сообщение послать). 

ОК.

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


 




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


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

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