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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
#1

Потоки - C++

23.02.2011, 13:14. Просмотров 831. Ответов 1
Метки нет (Все метки)

Задание:
1.Отображение списка запущенных потоков.
2.Создание нового потока по запросу пользователя.(это у меня сделано и работает)
3.Завершение заданного потока по запросу пользователя.
4.Завершение работы с корректным завершением всех потоков. (это вроде тоже работает)
если можете подскажите как реализовать 1 и 3 пункт
3 пункт, мне кажется надо выполнять с помощью функции ExitCreate но я не могу понять как её вставить.

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
#include "stdafx.h"
#include "locale.h"
#include "iostream"
#include <windows.h>
#include <strsafe.h>
// std::vector<MYDATA>
#define MAX_THREADS 3
#define BUF_SIZE 256
int numthreads = 0;
int a, i;
 
using namespace std;
 
typedef struct _MyData 
{
    char val1; // Символ
    int val2; // число задержки
    bool active; // нужно ли завершаться
    DWORD threadId; //массив
 
} MYDATA, *PMYDATA;
 
    MYDATA threads[MAX_THREADS];
    PMYDATA pData;
    DWORD dwThreadId[MAX_THREADS];
    HANDLE hThread[MAX_THREADS]; 
  DWORD dwExitCode;
DWORD WINAPI ThreadProc( LPVOID lpParam ) 
{ 
    PMYDATA pData=(PMYDATA)lpParam;
  
    HANDLE hStdout;
    TCHAR msgBuf[BUF_SIZE];
    size_t cchStringSize;
    DWORD dwChars;
 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdout == INVALID_HANDLE_VALUE )
        return 1;
    StringCchPrintf(msgBuf, BUF_SIZE, TEXT("\nПараметры = %d, %d\n"), 
        pData->val1, pData->val2); 
    StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
    WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL);
 
    for ( ;  ; )
    {
        printf("%c", pData->val1);
        Sleep(pData->val2);
    }
    return 0; 
} 
 void ViewMenu()
{
        cout << "\nCделайте свой выбор:\n";
        cout << "1.Отображение списка запущенных потоков.\n"<< endl;
        cout << "2.Создание нового потока по запросу пользователя.\n"<< endl;
        cout << "3.Завершение заданного потока по запросу пользователя.\n"<< endl;
        cout << "4.Завершение работы с корректным завершением всех потоков.\n"<< endl;
        cout << "Ваш Выбор: "<< endl;
        cin >> a;
 }
void ViewThreads() //вывод введеных потоков
 {
 
 }
void CreateNewThread()//ввод потоков. сделан///////////////////////////////////
{
   if(numthreads < MAX_THREADS)
    {
 
        pData = (MYDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));
        if( pData == NULL )
            ExitProcess(2);
        pData->val1 = (char)('A'+numthreads);
        pData->val2 = (numthreads+1)*500;
        hThread[numthreads] = CreateThread( NULL, 0, ThreadProc, pData, 0, &dwThreadId[numthreads]);
        if (hThread[numthreads] == NULL)
            ExitProcess(numthreads);
        numthreads++;
    }
}
 
void DeleteLastThread() // удаление потока
{ 
    
}
void main()
{
setlocale (LC_ALL, "Russian");
while(1)
    {
        ViewMenu();
        switch(a)
        {
        case(1):
            ViewThreads();
            break;
        case(2):
            CreateNewThread();
            break;
        case(3):
            DeleteLastThread();
            break;
        case(4):
             ExitProcess(1);
        printf("\n");
        system(" pause");
        exit(0);  
            break;
        default:
            cout << "Вы ввели не допустимое значение!";
        }}}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2011, 13:14     Потоки
Посмотрите здесь:

Потоки с++ C++
потоки.. C++
потоки C++
Потоки C++
Потоки C++
C++ Потоки
C++ VC, потоки.
Потоки C++
Потоки C++
C++ Потоки
C++ Потоки
C++ Потоки

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
23.02.2011, 19:44     Потоки #2
пусть у каждого треда будет имя, и по имени они будут удалятся.
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
#include <thread>
#include <iostream>
#include <string>
#include <list>
 
class my_thread {
private:
  std::thread this_thread;
  std::string name;
  bool go_on;
public:
  my_thread(const my_thread &t): name(t.name), go_on(true) {
  }
  my_thread(const std::string &s): name(s), go_on(true) {
  }
  void run() {
      this_thread = std::thread(&my_thread::go, this);
  }
  void join() {
    this_thread.join();
  }
  void go() {
    while (go_on) {
      std::cerr << "I am " << name << std::endl;
      sleep(1);
    }
  }
  void stop() {
    go_on = false;
  }
  std::string getName() {
    return name;
  }
};
 
int menu() {
  int ans;
  std::cout << "Menu::\n"
    "1-make new.\n"
    "2-list all.\n"
    "3-kill target.\n"
    "4-exit.\n";
  std::cin >> ans;
  return ans;
}
int main()
{
  std::list<my_thread> pool;
  bool exit = false;
  while (not exit) {
    int ans = menu();
    std::string s;
    switch(ans) {
    case 1:
      // creating new
      std::cout << "Enter thread name: ";
      std::cin >> s;
      pool.push_back(s);
      pool.back().run();
      break;
    case 2:
      // listing all threads
      std::cout << "--All threads: \n";
      for (auto i = pool.begin(); i != pool.end(); ++i) {
    std::cout << i->getName() << std::endl;
      }
      std::cout << "--end of thread list.\n";
      break;
    case 3:
      // deleting one of threads
      std::cout << "Enter name of thread: ";
      std::cin >> s;
      for (auto i = pool.begin(); i != pool.end(); ++i) {
    if (i->getName() == s) {
      i->stop();
      i->join();
      auto t = i;
      ++i;
      pool.erase(t);
    }
      }
      break;
    case 4:
      // exit
      for (auto i = pool.begin(); i != pool.end(); ++i) {
      i->stop();
      i->join();
      }
      pool.clear();
      exit = true;
      break;
    default:
      std::cout << "Unknowen command.\n";
    }
  }
  return 0;
}
компиляция: g++ ./tr_count.cpp -o prg --std=c++0x -g -lpthread
запуск: ./prg 2> log

все треды будут писать в файл log его можно открыть и убедиться что они работали.
Yandex
Объявления
23.02.2011, 19:44     Потоки
Ответ Создать тему
Опции темы

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