Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поток-глобальный & Переменная-локальная, организационный вопрос 
:(
    Опции темы
En_t_end
  Дата 15.12.2004, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Создан поток, рабочий... ему нужно работать с локальной переменной, но так как тело потока описанно, как глобальное(как описать его, как локальное ?), я имею нестыковку в плане того, что невидно этой переменной для потока...
Пытался решить проблему, путем использования в потоке новой глобальной переменной, но мне нужно ассинхронно обновлять результаты той локальной переменной, а значит создать ещё один поток, в котором опять не будет доступна эта локальная переменная.

Программа на базе диалогового окна, MFC, переменная в классе этого диалога, поэтому сделать её глобальной не вижу возможным, как выйти из получившейся ситуации?
Добавлено @ 20:50
В самом плохом варианте я уже сделал : это создание временного файлового буфера, следовательно большие накладные расходы ресурсов..

Это сообщение отредактировал(а) En_t_end - 15.12.2004, 20:43
PM MAIL ICQ Skype GTalk Jabber   Вверх
bel_nikita
Дата 15.12.2004, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



а чем public, friend не помогают?
можно переменную static объявить. только конечно доступ к ней синхронизировать


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mad
Дата 16.12.2004, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



En_t_end
Цитата(En_t_end @ 15.12.2004, 19:43)
переменная в классе этого диалога, поэтому сделать её глобальной не вижу возможным

Да и не надо smile, достаточно просто при создании потока, передать ему как параметр указатель на эту переменную

Код

class CMyDialog
{
   int m_AsyncVar;

   void CreateWorkThread(void);
};

void CMyDialog::CreateWorkThread(void)
{
   CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)&m_AsyncVar, 0, NULL);
);

void ThreadProc(LPVOID parm)
{
   int *m_AsyncVar = (int*)parm;

   *m_AsyncVar = 5;
}


Это сообщение отредактировал(а) Mad - 16.12.2004, 13:46


--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 16.12.2004, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Mad
Во как раз что мне нужно... !!! а ведь до простейших указателей я то не додумался smile
Кто-нибудь поставьте Mad'у "+"
Добавлено @ 16:50
bel_nikita
Ситуация не много другая, да и впрочем легче изменить тело потока, нежели класс... -для меня...
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 16.12.2004, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Интересно, а если надо использовать функцию, описанную в классе, в данном потоке, как тогда делать ?
PM MAIL ICQ Skype GTalk Jabber   Вверх
Plamenk
Дата 16.12.2004, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Передать указатель на экземпляр класса.

Это сообщение отредактировал(а) Plamenk - 16.12.2004, 20:07
PM MAIL   Вверх
Coocky
Дата 16.12.2004, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Вообще как-то пднимался вопрос об области видимости.Поищи в поисковике.Я как -то интересный пример приводил по связке классов и окон.Кому даже пример отослал.Там даже выход из ,казалось бы безвыходных ситуаций smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
En_t_end
Дата 17.12.2004, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Coocky
Чего-то я не нашёл smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mad
Дата 17.12.2004, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



En_t_end
Вопрос не совсем понятен, функция в контексте какого потока должна выполняться ?


--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 17.12.2004, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



"Вопрос не совсем понятен, функция в контексте какого потока должна выполняться ?"
Описанна в классе(диалога), а выполняться в создаваемом потоке...
Добавлено @ 18:51
Причём чего-то тут немного странно, допустим :
UINT sdfaofoqwfgo(LPVOID nParam)
{
MyProgDlg::MyFunc;
}
MyFunc(void) //типа так она выглядит... описанна там где должна...
{
countd = 123;
}
int countd = 0;
Дык если MyProgDlg::MyFunc; -оставить так, то всё будет нормально - компилятор материться не будет, но не будет получен желаемый результат - countd так и останется 0 smile, а вот если так : MyProgDlg::MyFunc();, то будет ругаться и тыкать в описание функции MyFunc() ^(
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mad
Дата 19.12.2004, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(En_t_end @ 17.12.2004, 17:42)
Описанна в классе(диалога), а выполняться в создаваемом потоке...

Если так то просто передавай указатель на нее или на класс.

Цитата(En_t_end @ 17.12.2004, 17:42)
Причём чего-то тут немного странно, допустим :
UINT sdfaofoqwfgo(LPVOID nParam)
{
MyProgDlg::MyFunc;
}
MyFunc(void) //типа так она выглядит... описанна там где должна...
{
countd = 123;
}
int countd = 0;


Тут много чего странного smile
Код

int countd = 0;
class MyProgDlg
{
public:
   void MyFunc(void);
   int countd;
};

UINT sdfaofoqwfgo(LPVOID nParam)
{
   MyProgDlg *pDlg = (MyProgDlg*)nParam;
   pDlg->MyFunc();
}
MyProgDlg::MyFunc(void)
{
   countd = 123; // присваивает pDlg->countd
   ::countd = 123;
}




--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 19.12.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



MAD
Спасибо
Короче я понял почему не работало, но более всего странно, что из-за моей ламерской ошибки компилятор не стал ругаться, почему ?
MyProgDlg::MyFunc; - Ведь действительно не правильно.... в случае применения, а не в случаи описания....
Вообщем надо опыта набираться smile

PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 19.12.2004, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Однако, раньше не работал с указателями на класс smile, да и вообще с классами не много работал... вот так я передаю указатель :
AfxBeginThread(DataOnLine, (LPVOID)&СMprogDlg);
DataOnLine - тело потока...

Вот ошибка :
'СMprogDlg' : illegal use of this type as an expression
Подозреваю, что проблема здесь (LPVOID)&СMprogDlg --- тут чего-то не хватает... smile

MAD
Огромное тебе спасибо и респект, за то что возишься со мной... smile


PM MAIL ICQ Skype GTalk Jabber   Вверх
Mad
Дата 20.12.2004, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(En_t_end @ 19.12.2004, 20:34)
AfxBeginThread(DataOnLine, (LPVOID)&СMprogDlg);

Понятие "указатель на класс" не существует, есть "указатель на обьект класса".
В твоем случае :
Код

CMprogDlg MprogDlg; // обьявление обьекта класса
AfxBeginThread(DataOnLine, (LPVOID)&MprogDlg);




--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 20.12.2004, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


 




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


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

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