Статус: Офлайн
Реєстрація: 28.07.2010
Повідом.: 31
Реєстрація: 28.07.2010
Повідом.: 31
мютекс и WaitForSingleObject в С#
Тренируюсь для личного интереса перевожу с С++ на С#. За мой бредняк не ругайте. Вот код на с++
А вот мое творчество
я знаю что *****, но подскажите
Тренируюсь для личного интереса перевожу с С++ на С#. За мой бредняк не ругайте. Вот код на с++
Код:
UINT EventThread(LPVOID pParam)
{
if(WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0) //проверка пока объект //не будет равен нулю
{
for(int i=0;i<128;i++)
{
GlobalArray[i] = GetNextNumber();
Sleep(5); //{приостановить исполнение потока на 5 милисекунд}
}
ReleaseMutex(hMutex);//Освобождение мьютекса
}
NumThread++;
if(NumThread>2)
{
Cl4_33Dlg* dlg=(Cl4_33Dlg*)pParam;
CString s;
for(int i=0;i<128;i++)
{
s.Format("%i",GlobalArray[i]);
dlg->m_list.AddString(s);
}
CloseHandle(hMutex);
}
return 0;
}
В обработчике кнопки инициализируем мьютекс
hMutex = CreateMutex(NULL, FALSE, NULL);
m_list.ResetContent();
AfxBeginThread(EventThread,this);
AfxBeginThread(EventThread,this);
А вот мое творчество
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int NextNumber=0;
int NumThread=1;
int[] GlobalArray = new int[128];
[DllImport("kernel32", EntryPoint = "WaitForSingleObject",
SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern uint WaitForSingleObject(
uint hHandle, uint dwMilliseconds);
uint hMutex;
UInt32 INFINITE=0;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false; // для управления контролами с многих потоков
}
int GetNextNumber()
{
NextNumber++;
return NextNumber;// возвращаем значение
}
[ DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
internal static extern Int32 WaitForSingleObject(IntPtr handle, Int32
milliseconds);
private void eventtread()
{
if (WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0)
{
for (int i = 0; i <= 127; i++) // цыкл от 0 до 127
{
GlobalArray[i] = GetNextNumber();// заполняем массив
Thread.Sleep(5);// задержка 5 мс
}
NumThread++;// инкримент
if (NumThread > 2)
{
for (int i = 0; i <= 127; i++)
{
string st = Convert.ToString(GlobalArray[i]);// конветируем int => string
//или listBox1.Items.Add( Convert.ToString(GlobalArray[i]);
listBox1.Items.Add(st);
}
}
}
}
private void start(object sender, EventArgs e)
{
hMutex = Convert.ToUInt32(new Mutex(true));
listBox1.Items.Clear();
NextNumber = 0;
NumThread = 1;
Thread s1 =
new Thread(new ThreadStart(this.eventtread));// создаем 1 поток
Thread s2 =
new Thread(new ThreadStart(this.eventtread));// создаем 2 поток
s1.Start(); // запускаем 1 поток
s2.Start();// запускаем 2 поток
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();// закрваем форму
}
public object WAIT_OBJECT_0 { get; set; }
}
}
