Другие языки программирования и технологии
как сделать так чтобы два блока программы выполнялись одновременно в c++ ?
сначала начинает выполнятся один блок программы, только потом второй, а нужно, чтобы выполнялось сразу два.
Потоки используй ( CreateThread )
Одновременно два или больше с взаимными блокировками доступа к общему - копай "thread" (Это библиотечно и системно зависимое - в самих плюсах этого нет. смотри на библиотеки под конкретную операционку от конкретной фирмы. в винде встроено "по событию новый поток" в юниксах надо самостоятельно разруливать и есть больше пространства для манёвра - ты не указываешь в какой среде и с какими библиотеками это надо делать)
Если для windows то вот держи накидал небольшой пример с семью потоками.
#include <windows.h>
#include <time.h>
#include <stdio.h>
#define MAX_THS 7
HANDLE hevent = NULL;
inline WORD FontColor(BYTE r, BYTE g, BYTE b){
if(!(r|g|b))
r |= 1;
return (WORD)((r*FOREGROUND_RED) | (g*FOREGROUND_GREEN) |
(b*FOREGROUND_BLUE)) | FOREGROUND_INTENSITY;
}
// поточная функция, выводит ID-потока в консоль
DWORD WINAPI ThreadProc(LPVOID arg){
wchar_t s[32];
short x = -1;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = *(COORD*)arg;
DWORD dwr = 0;
DWORD n = (DWORD)wsprintfW(s, L"ПОТОК ID: %u", GetCurrentThreadId());
CONSOLE_SCREEN_BUFFER_INFO si;
GetConsoleScreenBufferInfo(hout, &si);
const DWORD _twait = (DWORD)50 + (rand() % 100);
const WORD _fcol = FontColor((BYTE)rand()%2, (BYTE)rand()%2, (BYTE)rand()%2);
while(WaitForSingleObject(hevent, _twait) == WAIT_TIMEOUT) {
if(x != -1){
COORD pt = { x, pos.Y };
FillConsoleOutputCharacterW(hout, L'\0', n, pt, &dwr);
}
FillConsoleOutputAttribute(hout, _fcol, n, pos, &dwr);
WriteConsoleOutputCharacterW(hout, s, n, pos, &dwr);
x = pos.X;
++pos.X %= si.dwSize.X;
}
return 0;
}
int main(void){
hevent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(hevent == NULL)
return 1;
ResetEvent(hevent);
srand(time(NULL));
COORD pos[MAX_THS];
HANDLE ths[MAX_THS];
for(int i = 0; i < MAX_THS; ++i) {
pos[i].X = (short)(rand() % 20);
pos[i].Y = (short)(i+2)*2;
ths[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)&pos[i], 0, NULL);
}
puts("exit any key");
getchar();
SetEvent(hevent);
CloseHandle(hevent);
WaitForMultipleObjects(MAX_THS, ths, TRUE, INFINITE);
for(int t = 0; t < MAX_THS; ++t)
CloseHandle(ths[t]);
return 0;
}
#include <windows.h>
#include <time.h>
#include <stdio.h>
#define MAX_THS 7
HANDLE hevent = NULL;
inline WORD FontColor(BYTE r, BYTE g, BYTE b){
if(!(r|g|b))
r |= 1;
return (WORD)((r*FOREGROUND_RED) | (g*FOREGROUND_GREEN) |
(b*FOREGROUND_BLUE)) | FOREGROUND_INTENSITY;
}
// поточная функция, выводит ID-потока в консоль
DWORD WINAPI ThreadProc(LPVOID arg){
wchar_t s[32];
short x = -1;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = *(COORD*)arg;
DWORD dwr = 0;
DWORD n = (DWORD)wsprintfW(s, L"ПОТОК ID: %u", GetCurrentThreadId());
CONSOLE_SCREEN_BUFFER_INFO si;
GetConsoleScreenBufferInfo(hout, &si);
const DWORD _twait = (DWORD)50 + (rand() % 100);
const WORD _fcol = FontColor((BYTE)rand()%2, (BYTE)rand()%2, (BYTE)rand()%2);
while(WaitForSingleObject(hevent, _twait) == WAIT_TIMEOUT) {
if(x != -1){
COORD pt = { x, pos.Y };
FillConsoleOutputCharacterW(hout, L'\0', n, pt, &dwr);
}
FillConsoleOutputAttribute(hout, _fcol, n, pos, &dwr);
WriteConsoleOutputCharacterW(hout, s, n, pos, &dwr);
x = pos.X;
++pos.X %= si.dwSize.X;
}
return 0;
}
int main(void){
hevent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(hevent == NULL)
return 1;
ResetEvent(hevent);
srand(time(NULL));
COORD pos[MAX_THS];
HANDLE ths[MAX_THS];
for(int i = 0; i < MAX_THS; ++i) {
pos[i].X = (short)(rand() % 20);
pos[i].Y = (short)(i+2)*2;
ths[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)&pos[i], 0, NULL);
}
puts("exit any key");
getchar();
SetEvent(hevent);
CloseHandle(hevent);
WaitForMultipleObjects(MAX_THS, ths, TRUE, INFINITE);
for(int t = 0; t < MAX_THS; ++t)
CloseHandle(ths[t]);
return 0;
}
Сложно сказать про абстрактные блоки, но для распараллеливания можно использовать thread'ы. Но, всё зависит от самого кода и блоков.
Похожие вопросы
- программа не заканчивается нулем C++
- Подскажите пожалуйста, на каком языке написана программа, на С или C++
- На какой программе писать на языке C++?
- Возможно ли любую программу написать на языке C++ при помощи только структурного программирования, без ООП?
- Хочу что Бы У МЕНЯ было 2 скайпа Что я должна сделать? Возможно ли то, что бы они одновременно работали? /
- мне нужно сделать видео с эффектами, посоветуйте программу
- Критика программы, написанной на языке C
- пожалуйста, напишите мне программу этого вопроса в C ++.пожалуйста помогите. Создать динамический массив из N чисел.
- Почему в этой программе переменная объявлена дважды? (C++, WinAPI)
- Переведите программу из Pascal в C#