Форум программистов, компьютерный форум CyberForum.ru

Многопоточность в VC++ 2008 - C++

Восстановить пароль Регистрация
 
AncinetHero
49 / 49 / 3
Регистрация: 22.05.2011
Сообщений: 326
14.01.2012, 13:35     Многопоточность в VC++ 2008 #1
Где можно найти нормальный пример? Все, что запускаю не работает, а значит читать обьяснения нет смысла.
Вот например при таком коде (из msdn):
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// Potochnost.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
 
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
 
#define MAX_THREADS  32
 
// The function getrandom returns a random number between 
// min and max, which must be in integer range.
#define getrandom( min, max ) (SHORT)((rand() % (int)(((max) + 1) - \
                               (min))) + (min))
 
int main( void );                    // Thread 1: main 
void KbdFunc( void  );               // Keyboard input, thread dispatch
void BounceProc( void * MyID );      // Threads 2 to n: display 
void ClearScreen( void );            // Screen clear 
void ShutDown( void );               // Program shutdown 
void WriteTitle( int ThreadNum );    // Display title bar information 
 
HANDLE  hConsoleOut;                 // Handle to the console 
HANDLE  hRunMutex;                   // "Keep Running" mutex 
HANDLE  hScreenMutex;                // "Screen update" mutex
int     ThreadNr;                    // Number of threads started 
CONSOLE_SCREEN_BUFFER_INFO csbiInfo; // Console information 
 
 
int main() // Thread One 
{
    // Get display screen information & clear the screen.
    hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
    GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );
    ClearScreen();
    WriteTitle( 0 );
 
    // Create the mutexes and reset thread count.
    hScreenMutex = CreateMutex( NULL, FALSE, NULL );  // Cleared 
    hRunMutex = CreateMutex( NULL, TRUE, NULL );      // Set 
    ThreadNr = 0;
 
    // Start waiting for keyboard input to dispatch threads or exit.
    KbdFunc();
 
    // All threads done. Clean up handles.
    CloseHandle( hScreenMutex );
    CloseHandle( hRunMutex );
    CloseHandle( hConsoleOut );
}
 
void ShutDown( void ) // Shut down threads 
{
    while ( ThreadNr > 0 )
    {
        // Tell thread to die and record its death.
        ReleaseMutex( hRunMutex );
        ThreadNr--;   
    }
    
    // Clean up display when done
    WaitForSingleObject( hScreenMutex, INFINITE );
    ClearScreen();
}
 
void KbdFunc( void ) // Dispatch and count threads.
{
    int         KeyInfo;
 
    do
    {
        KeyInfo = _getch();
        if ( tolower( KeyInfo ) == 'a' && 
             ThreadNr < MAX_THREADS )
        {
            ThreadNr++;
            _beginthread( BounceProc, 0, &ThreadNr );
            WriteTitle( ThreadNr );
        }
    } while( tolower( KeyInfo ) != 'q' );
 
    ShutDown();
}
 
void BounceProc( void *pMyID )
{
    char    MyCell, OldCell;
    WORD    MyAttrib, OldAttrib;
    char    BlankCell = 0x20;
    COORD   Coords, Delta;
    COORD   Old = {0,0};
    DWORD   Dummy;
    char    *MyID = (char*)pMyID;
 
    // Generate update increments and initial 
    // display coordinates.
    srand( (unsigned int) *MyID * 3 );
 
    Coords.X = getrandom( 0, csbiInfo.dwSize.X - 1 );
    Coords.Y = getrandom( 0, csbiInfo.dwSize.Y - 1 );
    Delta.X = getrandom( -3, 3 );
    Delta.Y = getrandom( -3, 3 );
 
    // Set up "happy face" & generate color 
    // attribute from thread number.
    if( *MyID > 16)
        MyCell = 0x01;          // outline face 
    else
        MyCell = 0x02;          // solid face 
    MyAttrib =  *MyID & 0x0F;   // force black background 
 
    do
    {
        // Wait for display to be available, then lock it.
        WaitForSingleObject( hScreenMutex, INFINITE );
 
        // If we still occupy the old screen position, blank it out. 
        ReadConsoleOutputCharacter( hConsoleOut, &OldCell, 1, 
                                    Old, &Dummy );
        ReadConsoleOutputAttribute( hConsoleOut, &OldAttrib, 1, 
                                    Old, &Dummy );
        if (( OldCell == MyCell ) && (OldAttrib == MyAttrib))
            WriteConsoleOutputCharacter( hConsoleOut, &BlankCell, 1,
                                         Old, &Dummy );
 
        // Draw new face, then clear screen lock 
        WriteConsoleOutputCharacter( hConsoleOut, &MyCell, 1, 
                                     Coords, &Dummy );
        WriteConsoleOutputAttribute( hConsoleOut, &MyAttrib, 1, 
                                     Coords, &Dummy );
        ReleaseMutex( hScreenMutex );
 
        // Increment the coordinates for next placement of the block. 
        Old.X = Coords.X;
        Old.Y = Coords.Y;
        Coords.X += Delta.X;
        Coords.Y += Delta.Y;
 
        // If we are about to go off the screen, reverse direction 
        if( Coords.X < 0 || Coords.X >= csbiInfo.dwSize.X )
        {
            Delta.X = -Delta.X;
            Beep( 400, 50 );
        }
        if( Coords.Y < 0 || Coords.Y > csbiInfo.dwSize.Y )
        {
            Delta.Y = -Delta.Y;
            Beep( 600, 50 );
        }
    }
    // Repeat while RunMutex is still taken. 
    while ( WaitForSingleObject( hRunMutex, 75L ) == WAIT_TIMEOUT );
}
 
void WriteTitle( int ThreadNum )
{
    enum { 
        sizeOfNThreadMsg = 80 
    };
    char    NThreadMsg[sizeOfNThreadMsg];
 
    sprintf_s( NThreadMsg, sizeOfNThreadMsg, 
               "Threads running: %02d.  Press 'A' "
               "to start a thread,'Q' to quit.", ThreadNum );
    SetConsoleTitle( NThreadMsg );
}
 
void ClearScreen( void )
{
    DWORD    dummy;
    COORD    Home = { 0, 0 };
    FillConsoleOutputCharacter( hConsoleOut, ' ', 
                                csbiInfo.dwSize.X * csbiInfo.dwSize.Y, 
                                Home, &dummy );
}
Выдает:
1>error C2664: ReadConsoleOutputCharacterW: невозможно преобразовать параметр 2 из 'char *' в 'LPWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>error C2664: WriteConsoleOutputCharacterW: невозможно преобразовать параметр 2 из 'char *' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>error C2664: WriteConsoleOutputCharacterW: невозможно преобразовать параметр 2 из 'char *' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>error C2664: SetConsoleTitleW: невозможно преобразовать параметр 1 из 'char [80]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2012, 13:35     Многопоточность в VC++ 2008
Посмотрите здесь:

C++ Многопоточность
C++ Многопоточность
C++ Будут ли мои многопоточные решения кроссплатформенными?
C++ Многопоточность
Многопоточность C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
14.01.2012, 14:07     Многопоточность в VC++ 2008 #2
бл* да АНАЛИЗИРУЙТЕ ВЫ ОШИБКИ!!!
ну НЕ ПРИЧЕМ тут многопоточность!!!
и 1 страница в гугле тебе ответ даст на ошибку.
http://yandex.ru/yandsearch?text=+%2...PCWSTR%27&lr=2
AncinetHero
49 / 49 / 3
Регистрация: 22.05.2011
Сообщений: 326
21.01.2012, 12:44  [ТС]     Многопоточность в VC++ 2008 #3
OstapBender, я пробовал что то изменить и не получалось.

Не по теме:

Вам нужно бы выпить валерьяночки


C++
1
ReadConsoleOutputCharacter( hConsoleOut, &OldCell, 1, Old, &Dummy );
1>error C2664: ReadConsoleOutputCharacterW: невозможно преобразовать параметр 2 из 'char *' в 'LPWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Подскажите, пожалуйста, правильный вариант...
-=ЮрА=-
Заблокирован
Автор FAQ
21.01.2012, 12:51     Многопоточность в VC++ 2008 #4
Цитата Сообщение от AncinetHero Посмотреть сообщение
OstapBender, я пробовал что то изменить и не получалось.
- уже сколько раз встречаю почти беспомощность людей на такие предупреждения

Цитата Сообщение от AncinetHero Посмотреть сообщение
ReadConsoleOutputCharacterW
- ну понятноже что у функции 2 прототипа, один для char ReadConsoleOutputCharacterA другой для TCHAR ReadConsoleOutputCharacterW. Решение до боли примитивно - везде где видим предупреждение пишем А вконце функции, к примеру

Цитата Сообщение от AncinetHero Посмотреть сообщение
ReadConsoleOutputCharacter( hConsoleOut, &OldCell, 1,
* * * * * * * * * * * * * * * * * * Old, &Dummy );
- следует записать
ReadConsoleOutputCharacterА( hConsoleOut...
-=ЮрА=-
Заблокирован
Автор FAQ
21.01.2012, 12:58     Многопоточность в VC++ 2008 #5
В 2008-й код вообще без исправлений откомпилировался, ниже скрин и проект в 9-ке
Миниатюры
Многопоточность в VC++ 2008  
Вложения
Тип файла: rar Potochnost_VS9.0.rar (5.6 Кб, 12 просмотров)
Yandex
Объявления
21.01.2012, 12:58     Многопоточность в VC++ 2008
Ответ Создать тему
Опции темы

Текущее время: 01:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru