Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: kharkovforum.com@gmail.com

мютекс и WaitForSingleObject в С#

  • Автор теми Автор теми zabr91
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 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; }
    }
}
я знаю что *****, но подскажите
 
полная фигня, изучи вначале C#, прежде чем переводить... ;)
 
следуя с этого
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Код:
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
    {
        [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
        internal static extern Int32 WaitForSingleObject(IntPtr handle, Int32
        milliseconds);

        const UInt32 INFINITE = 0xFFFFFFFF;
        const UInt32 WAIT_ABANDONED = 0x00000080;
        const UInt32 WAIT_OBJECT_0 = 0x00000000;
        const UInt32 WAIT_TIMEOUT = 0x00000102;


        IntPtr hMutex;
        
         int NextNumber=0;
         int NumThread=1;
         int[] GlobalArray = new int[128];

     
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;  // для управления контролами с многих потоков
        }
        int GetNextNumber()
        {
            NextNumber++;
            return NextNumber;// возвращаем значение
        }


        private void eventtread()
        {
            if (WaitForSingleObject(hMutex, Convert.ToInt32(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 = new Mutex();  // но тут фигня 

            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();// закрваем форму
        }

    }
}
все равно не выходит
 
все равно не выходит

говорю-же фигня это полная, бред сивой кобылы. Как можно приводить менеджед объект к инту и потом результат передавать в апишный вызов как хэндл? Как такой бред можно было написать?

Из приведенного фрагмента следует только одно - написавший не понимает даже базовых основ языка. Учи язык с самых базовых основ - value/reference типы, boxing/unboxing, базовые операции и т.д.
И на будующее рекомендую не писать код, не понимая что он делает. Если хочешь хорошим программером стать ;)

Пока язык не выучишь в p/invoke вообще не лезь. К тому же, в данном случае, он ***** не нужен.
 
В исходном коде на с++ тоже ерунда какая-то написана. Не рассматривая логику тредов:


Если NumThread глобальная, то инкрементить либо под мютексом, либо через InterlockedIncrement
 
Назад
Зверху Знизу