Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для White Luna
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402

Потоки

23.02.2011, 13:14. Показов 1805. Ответов 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 << "Вы ввели не допустимое значение!";
        }}}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2011, 13:14
Ответы с готовыми решениями:

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

потоки
Здравствуйте. Есть форма, на которой есть два объекта Button. При нажатии на каждый выполняется умножение 2 функции и в 2 объекта Label...

потоки
Можно ли както вызывать одну функцию , передавая разные параметры , в разных потоках(_beginthread) одновременно? (Например передавать...

1
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
23.02.2011, 19:44
пусть у каждого треда будет имя, и по имени они будут удалятся.
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 его можно открыть и убедиться что они работали.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2011, 19:44
Помогаю со студенческими работами здесь

Потоки
Всем привет! Делаю тут одну программу(консольную игру), возникла надабность запустить одну и туже функцию в паралельных потоках, т. е....

Потоки
Здравствуйте. Изначально код моей программы выглядел примерно так void Thread( void* pParams ) { //Код } void Thread1(...

Потоки
Пытаюсь создать поток #include&lt;windows.h&gt; #include&lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;process.h&gt; #include &lt;fstream&gt; ...

Потоки
Почему при запуске функции в отдельном потоке нельзя передать в нее значение по ссылке,а только через указатель?

потоки
1---------------------------------------------------------------------------------------------------------- Можно ли перенаправить потоки...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru