Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/41: Рейтинг темы: голосов - 41, средняя оценка - 4.76
28 / 28 / 11
Регистрация: 10.03.2012
Сообщений: 86
Записей в блоге: 5
1

Мютекс и WaitForSingleObject

18.07.2012, 14:58. Показов 7609. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Тренируюсь для личного интереса перевожу с С++ на С#. За мой бредняк не ругайте. Вот код на с++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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);
А вот мое творчество
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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; }
    }
}
я знаю что косяк, но подскажите как правильно перевести
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2012, 14:58
Ответы с готовыми решениями:

Многопоточность и мютекс
Всем добрый день. Делаю сейчас лабораторную по системному программированию, с++ и WinApi. Задание...

Потоки, используя критические секции или мютекс
Как написать на языке С программу, которая содержит две функции, описывающие два потока? Первый...

WaitForSingleObject
Приветствую. Вот собственно код который нужно поправить. void changeFile() { DWORD...

Потоки. WaitForSingleObject.
Здравствуйте! Помогите пожалуйста решить проблему. Читать лучше сразу самый низ кода - большой...

4
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
18.07.2012, 15:11 2
А чем вам родные мьютексы C# не устраивают? Зачем импортировать из kernel32?
Используйте Mutex mutex = new Mutex() вместо CreateMutex() и mutex.WaitOne() вместо WaitForSingleObject().
0
28 / 28 / 11
Регистрация: 10.03.2012
Сообщений: 86
Записей в блоге: 5
18.07.2012, 23:21  [ТС] 3
следуя с этого http://www.pinvoke.net/default... ngleobject
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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();// закрваем форму
        }
 
    }
}
все равно не выходит
0
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
18.07.2012, 23:49 4
Потому что
C#
1
IntPtr hMutex
надо заменить на
C#
1
 Mutex hMutex
а это
C#
1
2
3
4
5
6
if (WaitForSingleObject(hMutex, Convert.ToInt32(INFINITE)) == WAIT_OBJECT_0)
{
 
.......... // Много кода
 
}
заменить на
C#
1
2
3
4
5
hMutex.WaitOne();
 
.......... // Много кода
 
hMutex.ReleaseMutex();
ну и вот это можно выкинуть
C#
1
2
3
4
5
6
7
8
[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;
1
28 / 28 / 11
Регистрация: 10.03.2012
Сообщений: 86
Записей в блоге: 5
19.07.2012, 07:47  [ТС] 5
В итоге у нас такое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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
    {
        Mutex 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()
        {
          hMutex.WaitOne();
                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);
                    }
                }
           hMutex.ReleaseMutex();
        }
 
      
        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();// закрваем форму
        }
 
    }
}
0
19.07.2012, 07:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2012, 07:47
Помогаю со студенческими работами здесь

WaitForSingleObject - проблема!
здравствуйте, у меня есть шаблонный список елементов структуры struct proc { int exename;...

WaitForSingleObject(). C++ WinAPI
Привет. У меня вопрос : почему во время работы WaitForSingleObject() я могу вывоить часы реального...

SetEvent + WaitForSingleObject
Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и...

WaitForSingleObject и многопоточность
Добрый день! Мучаюсь с такой задачкой. Имеется C++ DLL, которую до меня писал другой программист....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru