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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 23:21   #11
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

адресс понятное дело на переменную стрктуры
мне пример б по использованию как тут указать его и передать, а затем в потоке обратиться
Alexandr555 вне форума Ответить с цитированием
Старый 24.01.2013, 23:32   #12
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
struct PRM
{
	int x;
	int y;
};

void trdproc(void* p)
{
	PRM left = *((PRM*)p);
	//left.x;
	//left.y;
}

int main ()
{

	PRM prm;
	prm.x = 1;
	prm.y = 2;

	_beginthread(trdproc, 0, &prm);
}
Это просто для примера. В реальности нужно быть уверенным, что время жизни структуры будет достаточным для того, чтобы новый поток ее прочитал.
Есть разные варианты. Зависит от реальной задачи.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 00:29   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно поподробней?
Можешь закидать меня помидорами, но мой вывод основывается в основном на разных данных из общения с коллегами. Особых причин не использовать таймер нет, именно поэтому я написал "не рекомендуется" а не "ни в коем случае". Основной камень преткновения - не вызывается callback или вызывается не вовремя. Еще бытует мнение что если callback процедура не успевает отрабатывать за время таймера могут быть накладки когда один цикл еще не закончился а следующий уже начинается. На последнем я попадался иногда, когда неправильно строил структуру проекта. Хоть и редко но метко.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.01.2013, 01:12   #14
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Помидоры съедим сами
Callback тамера выполняется в том же потоке что и главный цикл, и разумеется, если основной поток тормозит настолько, что интервал вызова callback не совпадает с заявленым в SetTimer, то ничего хорошего в этом нет.
Но эта кривизна будет одинаково проявлятся как в консольном приложении, так и в виндовом.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 08:06   #15
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

Код:
          PRM bull;
	int t1,t2,i;
for(i=0;i<=10;i++)
{bull.x=i;
bull.y=i;

_beginthread(Thread, 0,&bull);
}


void Thread(void* p )
  {  short x,y;
PRM left = *((PRM*)p);
x=left.x;
y=left.y;
	  
      Sleep(1000*y); 
	  cout <<x; 
	  _endthread();
  }
вот не думал что так будет, а тут в каждом потоке все к одной переменной обращается..
и выводит 11 десяток... нельзя их локальными сделать?
Alexandr555 вне форума Ответить с цитированием
Старый 25.01.2013, 11:08   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но эта кривизна будет одинаково проявлятся как в консольном приложении, так и в виндовом.
Верно. Тут я полностью согласен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.01.2013, 12:31   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
вот не думал что так будет, а тут в каждом потоке все к одной переменной обращается..
Не удивительно, ведь переменная-то объявлена одна. Объявите десяток.
Еще можно в основном потоке создавать структуру через new, а в новом потоке удалять /delete/ после прочтения.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 15:30   #18
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

Код:
for(i=0;i<=10;i++)
{ 
	
ItP *pItP = new ItP;
pItP.y=i;
_beginthread(Thread, 0,pItP);
}
Код:
void Thread(void* p )
  {   
	  short x,y;
ItP * pItP =(ItP *)p;
x=p.x+1;
y=p.y+1;
delete pItP;	  
      Sleep(1000*y); 
	  cout <<x; 
	  _endthread();
  }
не выходит, все ошибки ругаются
Цитата:
выражение слева от ".y" должно представлять класс, структуру или объединение тип: ItP *
Alexandr555 вне форума Ответить с цитированием
Старый 25.01.2013, 15:36   #19
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
выражение слева от ".y" должно представлять класс, структуру или объединение тип: ItP *
Конечно. ItP *- не структура, а указатель на нее.
Доступ к полям структуры через указатель выполняется через ->
ПС. Попробуйте язык D. Там такое прокатит:
Код:
ItP *pItP  = new ItP;
int x = pItP.x;

Последний раз редактировалось EUGY; 25.01.2013 в 15:44.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 16:14   #20
Alexandr555
Форумчанин
 
Регистрация: 23.03.2011
Сообщений: 310
По умолчанию

Код:
for(i=0;i<=10;i++)
{ 
	
ItP *pItP = new ItP;
pItP->x=i;
pItP->y=i;
_beginthread(Thread, 0,pItP);
}
Код:
void Thread(void* p )
  {   
	  short x,y;
ItP * pItP =(ItP *)p;
x=pItP->x;
y=pItP->y;
delete pItP;	  
      Sleep(1000*y); 
	  cout <<x; 
	  _endthread();
  }
ну все вроде работает как надо, а D уж если после серьезного изучения С++, который пока третий день учу.
Alexandr555 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов SetTimer в чужих окнах BLACK_RAIN Win Api 38 06.05.2012 14:40
Таймер SetTimer и глюки с ним Jugger Win Api 2 09.03.2012 20:21
Settimer в winx64 не работает, рушит Excel?! budda999 Microsoft Office Excel 9 07.01.2012 13:43
SetTimer, KillTimer NeiL Win Api 5 05.03.2008 07:37