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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2013, 12:14   #1
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию Потоки в windows forms. Непонятная ошибка

Добрый день!
Пытаюсь в обработчике кнопки сделать поток, на MSDN нашел пример:

Код:
unsigned Counter;
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
      while ( Counter < 1000000 )
      Counter++;
    _endthreadex( 0 );
    return 0;
} 
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

  Queue^ noptQ = gcnew Queue;

  	
   HANDLE hThread;
    unsigned threadID;

     // Create the second thread.
    hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
    WaitForSingleObject( hThread, INFINITE );
    
    // Destroy the thread object.
    CloseHandle( hThread );
	
   noptQ->Enqueue( "The" );
   noptQ->Enqueue( "quick" );
   noptQ->Enqueue( "brown" );
   noptQ->Enqueue( "fox" );
   array<Object^>^myStandardArray = noptQ->ToArray();
   this->textBox1->Text=myStandardArray[2]->ToString();
но на строчку
Код:
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
ругается, пишет :error C2276: &: недопустимая операция с выражением привязанной функции-члена...
как это исправить? если "&" просто убрать - то пишет : error C3867 My11::Form1::SecondThreadFunc: в вызове функции отсутствует список аргументов; используйте "&My11::Form1::SecondThreadFunc "

Прошу помощи, не пойму что не так...в консоли все работает...
hunter03 вне форума Ответить с цитированием
Старый 26.08.2013, 13:11   #2
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Попробовал написать так:
Код:
unsigned Counter;
private: unsigned __stdcall SecondThreadFunc( void* pArguments )
{
    //printf( "In second thread...\n" );

    while ( Counter < 1000000 )
        Counter++;

    _endthreadex( 0 );
    return 0;
} 
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
int mas[100];
mas[1]=1;
  Queue^ noptQ = gcnew Queue;
 
	HANDLE hThread;
    unsigned threadID;

     // Create the second thread.
	hThread = (HANDLE)_beginthreadex( NULL, 0,&SecondThreadFunc((void*)mas), NULL, 0, &threadID );
    WaitForSingleObject( hThread, INFINITE );
    
    // Destroy the thread object.
    CloseHandle( hThread );
	
   noptQ->Enqueue( "The" );
   noptQ->Enqueue( "quick" );
   noptQ->Enqueue( "brown" );
   noptQ->Enqueue( "fox" );
   array<Object^>^myStandardArray = noptQ->ToArray();
   this->textBox1->Text=myStandardArray[2]->ToString();

		 }
Но получил ошибку error C2102: для "&" требуется левостороннее значение

Помогите с этой штукой... такая ерунда, а загнала в тупик
hunter03 вне форума Ответить с цитированием
Старый 26.08.2013, 17:01   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а вы зачем мешаете управляемый и неуправляемый код?

в Net есть свои классы, которые занимаются управлением потоками.

http://msdn.microsoft.com/en-us/libr...Threading.aspx
http://support.microsoft.com/kb/815805/ru
counter вне форума Ответить с цитированием
Старый 26.08.2013, 17:20   #4
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

о, спасибо! во 2 примере подробно описано
hunter03 вне форума Ответить с цитированием
Старый 26.08.2013, 18:23   #5
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Можно вопрос?
Где конкретно писать этот код в студии 2008?
Код:
Добавьте следующий код в класс Form1 .
__delegate void DelegateThreadTask();
private: void ThreadTask()
{
	int stp;
	int newval;
	Random *rnd=new Random();

	if (progressBar1->InvokeRequired == false)
		{
		stp=this->progressBar1->Step*rnd->Next(-1,2);
		newval = this->progressBar1->Value + stp;

		if (newval > this->progressBar1->Maximum)
			newval = this->progressBar1->Maximum;
		else if (newval < this->progressBar1->Minimum)
			newval = this->progressBar1->Minimum;

		this->progressBar1->Value = newval;
		}
	else 
		{
		DelegateThreadTask *myThreadDelegate = new DelegateThreadTask(this,ThreadTask);
		this->Invoke(myThreadDelegate);			
		}
}
private: void repeat()
{	
	while(true)
	{
	ThreadTask();
	Thread::Sleep(100);
	}
}
при добавлении кода куча ошибок...
и для использования __delegate нужно включить oldSyntax
Но при его включении появляются вообще непонятные ошибки

Последний раз редактировалось hunter03; 26.08.2013 в 18:47.
hunter03 вне форума Ответить с цитированием
Старый 26.08.2013, 19:02   #6
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Есть ли какие то варианты для создания потоков без делигатов и использования oldSyntax?
неможет быть что бы можно было сделать только так...
hunter03 вне форума Ответить с цитированием
Старый 27.08.2013, 15:12   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Где конкретно писать этот код в студии 2008?
думаю, сначала нужно создать проект...
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows Forms С++ Aleks1994 Помощь студентам 2 04.04.2013 18:40
WPF и Windows Forms grigorill2 C# (си шарп) 0 20.02.2011 10:00
Windows Forms masashama Windows Forms 12 14.02.2011 16:14
windows.forms *stRong* Помощь студентам 0 04.06.2010 04:39