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

Потоки - C++

Восстановить пароль Регистрация
 
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
09.08.2011, 16:53     Потоки #1
Всем привет!
Делаю тут одну программу(консольную игру), возникла надабность запустить одну и туже функцию в паралельных потоках, т. е. что бы они выполнялись одновременно, как это можно реализовать ? Не имеет значение какие потоки, можно и boost и WinAPI.
Зрание спасибо.

Добавлено через 55 минут
Во к примеру код
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <boost/thread/thread.hpp>
 
const size_t X = 25, Y = 39;
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
 
struct coord
{
    size_t x, y;
};
 
struct falling_stone
{
    coord pos;
};
 
void fl_st(){
  srand(time(0));
  falling_stone st;
  st.pos.x = 1;
  st.pos.y = rand() % Y;
  int x = st.pos.x;
  COORD c;
  for(; x != X - 1; ++x)
  {
      c.X = (SHORT)(st.pos.y * 2);
      c.Y = (SHORT)x;
      SetConsoleCursorPosition(hd, c);
      std::cout << ' ';
      c.Y = (SHORT)x + 1;
      SetConsoleCursorPosition(hd, c);
      std::cout << '@';
      Sleep(100);
  }
  c.Y = X - 1;
  SetConsoleCursorPosition(hd, c);
  std::cout << ' ';
}
 
void t_flst()
{
    for(;;)
    {
      fl_st();
    }
}
 
int main()
{
    bool flag = false;
    for(;;){
      if(!flag)
      {
        boost::thread t(t_flst);
        flag = true;
      }
    }
    system("pause >> void");
    return 0;
}
здесь один символ @ падает сверху консоли на низ, затем еще и так бесконечно, но он падает один, как сделать, чтобы сразу падали несколько, допустим 5 ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2011, 16:53     Потоки
Посмотрите здесь:

Потоки C++
Потоки с++ C++
потоки.. C++
потоки C++
Потоки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
09.08.2011, 19:03     Потоки #2
попробуй использовать beginthread
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
09.08.2011, 19:16  [ТС]     Потоки #3
Не могли бы показать на примере ? А то я уже как только не пытался.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
09.08.2011, 19:22     Потоки #4
C++
1
_beginthread(имя функции,размер стека,параметры)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.08.2011, 19:23     Потоки #5
А вывести в цикле пять значков не судьба? Зачем сам себе усложняешь где не надо?
Если не можешь создать поток, то и критическую секцию, вероятно, создать не сможешь. А без синхронизации функция fl_st работает не корректно.
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
09.08.2011, 19:50  [ТС]     Потоки #6
Deviaphan, Спасибо, а то я что-то зациклился уже на этих потоках.
Еще один вопрос: Как записать например такой кусок кода
C++
1
2
3
4
5
6
void f(){/*some code*/}
 
int main()
{
    boost::thread th(f);
}
но средставми WinAPI, т. е. с сипользованием тех потоков, которые там есть.
Спасибо.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
09.08.2011, 19:55     Потоки #7
bambino, а что делает этот код?
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
09.08.2011, 20:03  [ТС]     Потоки #8
aram_gyumri, Запускаеться новый поток, вызывающий функцию f()
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.08.2011, 20:08     Потоки #9
http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
09.08.2011, 20:09     Потоки #10
C++
1
2
3
4
HANDLE tr[5];
HANDLE id_thread;
for(int i=0;i<5;i++)
tr[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)name_of_function,NULL,0,&id_thread);
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
09.08.2011, 20:19     Потоки #11
bambino, тебе нужен вывод для видимой области консольного окна, синхронизация вообще здесь не нужна если вывод едёт весь в одном потоке, для текущего можно осуществлить ввод.
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
#include <windows.h>
#include <time.h>
#define  MAX_DOGS   5
 
HANDLE hout;
bool   tabort = true;
 
 
DWORD __stdcall Thread(LPVOID);
void  Draw(COORD pos, WORD color, TCHAR sign);
void  Clear(COORD pos, TCHAR sign);
void  InitObj(COORD* pos, UINT size, SHORT width);
 
 
int main(void){
 
    HANDLE  thread;
    DWORD   tid;
    hout     = GetStdHandle(STD_OUTPUT_HANDLE);
 
    CONSOLE_SCREEN_BUFFER_INFO  info;
    ZeroMemory(&info, sizeof(CONSOLE_SCREEN_BUFFER_INFO));
    GetConsoleScreenBufferInfo(hout, &info);  // получения размера буфера консоли
 
    thread = CreateThread(NULL, 0U, Thread, (LPVOID)&info, THREAD_PRIORITY_NORMAL, &tid);
 
    // при нажатие на клав-escape выход
    while(! GetAsyncKeyState(VK_ESCAPE));
    tabort = false;
    Sleep(100u);
    CloseHandle(thread);
    return 0;
}
 
// поток для рисования собак
DWORD __stdcall Thread(LPVOID param) {
   CONSOLE_SCREEN_BUFFER_INFO  info = *(CONSOLE_SCREEN_BUFFER_INFO*)param;
   COORD  obj[MAX_DOGS], tmp;
   int i;
   InitObj(obj, MAX_DOGS, info.dwSize.X);
 
   while(tabort) {
 
      for(i = 0; i < MAX_DOGS; i++) { // цикл по всем собакам
          tmp  = obj[i];
          obj[i].Y++;
          Draw(obj[i], 12, '@');
          Clear(tmp, ' ');
          //   SetConsoleCursorPosition(hout, obj[i]);
          if(obj[i].Y >= 28 /*info.dwSize.Y*/) {  
                Clear(obj[i], ' ');
                InitObj(&obj[i], 1, info.dwSize.X);
                break;
          }
      }
 
      Sleep(100u); 
   }
   ExitThread(0u);
   return 0;
}
 
// расстановка координат собак
void  InitObj(COORD* pos, UINT size, SHORT width) {
     srand(time(NULL));
     width--;
     while(size--) {
       (*pos).X = rand() % width;
       (*pos).Y = -rand() % 4;
       ++pos;
     }
}
 
// функция для рисования символа
void    Draw(COORD pos, WORD color, TCHAR sign) {
    DWORD dw = 0u;
    WriteConsoleOutputCharacter(hout, &sign,  1, pos, &dw);
    WriteConsoleOutputAttribute(hout, &color, 1, pos, &dw);
}
 
// функция для затирания символа
void  Clear(COORD pos, TCHAR sign) {
    DWORD dw = 0u;
    FillConsoleOutputAttribute(hout, 0,    1, pos, &dw);
    FillConsoleOutputCharacter(hout, sign, 1, pos, &dw);
}
Сейчас я с похмелья голова побаливает.
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
16.08.2011, 19:14  [ТС]     Потоки #12
Все-таки хочу вернуться к вопросу: "Как запустиь функцию в паралельных потоках ?"
Вот у меня 5 символов падают в одну линию и другая линия тех символов не появиться, пока предедущая не подойдет до низу, как сделать так, что бы этих линий симолов было сразу хотя б 5 ? Спасибо.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.08.2011, 19:53     Потоки #13
Эту проблему не нужно решать при помощи потоков. Хотя бы потому, что первый символ может нарисоваться несколько раз, когда остальные ни разу даже не нарисуются. А добавив синхронизацию ты всё сведёшь к извращённой реализации цикла. Так что не мудри и рисуй их в цикле.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2011, 20:19     Потоки
Еще ссылки по теме:

потоки C++
Потоки C++
Потоки C++

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

Или воспользуйтесь поиском по форуму:
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
16.08.2011, 20:19  [ТС]     Потоки #14
Блин, что-то не могу реализовать, не подскажите ?
Yandex
Объявления
16.08.2011, 20:19     Потоки
Ответ Создать тему
Опции темы

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