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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2016, 12:33   #1
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию Синхронизация потоков

Здравствуйте.
Есть следующий код:
Код:
#include <windows.h>
#include <process.h>
 
CRITICAL_SECTION cs;
...
...
private: String^ L;
delegate void SetVoidDelegate();
 
    private: void Logs()
    {
        if(this->progressBar1->InvokeRequired)
        {   
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::Logs);
            this->Invoke(d);
        }
        else
        {
            this->richTextBox1->AppendText( this->L );
            this->Flag = true;
        }
    }
 
    
    private: void repeat()
    {   
        EnterCriticalSection( &cs );
        this->L = Thread::CurrentThread->Name;
        this->Logs();
        this->L = "\n";
        this->Logs();
        LeaveCriticalSection( &cs );
        Thread::Sleep(1000);
    }
 
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) 
    {
        InitializeCriticalSection( &cs );
        ThreadStart ^myThreadDelegate = gcnew ThreadStart(this, &Test::Form1::repeat);
        array <Thread^>^ potok = gcnew array <Thread^>(5);
        for(int i = 0; i < 5; i++)
        {
            potok[i] = gcnew Thread(myThreadDelegate);
            potok[i]->Name = i.ToString();
            potok[i]->IsBackground = true;
            potok[i]->Priority = System::Threading::ThreadPriority::Normal;
            potok[i]->Start();
        }
        DeleteCriticalSection( &cs );
    }
При его работе выскакивает исключение:
Цитата:
An unhandled exception of type 'System.AccessViolationException' occurred in Test.exe

Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Так же попробовал заменить обращение к критической секции следующим кодом:
Код:
		Monitor::Enter(L);
		this->L = Thread::CurrentThread->Name;
		this->Logs();
		this->L = "\n";
		this->Logs();
		Monitor::Exit(L);
Получаю следующую ошибку:
Цитата:
An unhandled exception of type 'System.Threading.SynchronizationLo ckException' occurred in Test.exe

Additional information: Для не синхронизированного блока кода вызван метод синхронизации объектов.
Собственно вопрос : как нужно синхронизировать потоки при работе с общей переменной? Спасибо.
Gdasar вне форума Ответить с цитированием
Старый 01.12.2016, 13:23   #2
Gdasar
Пользователь
 
Регистрация: 18.02.2013
Сообщений: 60
По умолчанию

Сделал:
Код:
		private: Object^ threadLock;
		...
		...
		try
		{
			Monitor::Enter(this->threadLock);
			this->L = Thread::CurrentThread->Name;
			this->Logs();
			this->L = "\n";
			this->Logs();
		}
		finally
		{
			Monitor::Exit(this->threadLock);
		}
Gdasar вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
синхронизация потоков Diego__ Общие вопросы C/C++ 0 30.09.2014 17:08
Синхронизация потоков добрый_фей Помощь студентам 5 09.12.2011 19:57
Синхронизация потоков alenka_ej Помощь студентам 0 03.06.2010 22:20
Синхронизация потоков в С++ erazer89 Помощь студентам 0 27.04.2010 20:14