Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/67: Рейтинг темы: голосов - 67, средняя оценка - 4.84
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107

Два потока в одной программе

08.03.2010, 05:19. Показов 14390. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Две фунцкии одной программы оформить как две функции потока. После ввода значений запускаются два требуемых потока, а потом на экран выводится полученные значения.

Все функции я написал, работает программа. Не могу понять, как создать 2 потока через CreateThread, а закрыть его еще сложнее т-т

Псевдокод:
<ввод параметров>

*создание потока*
-работае кусок программы в потоке
*создание потока*
-работает кусок программы в потоке
Вывод printf
завершение программки (нужно ли еще закрыть потоки?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.03.2010, 05:19
Ответы с готовыми решениями:

Два потока, две очереди, два потока
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные из своей очереди. Но когда одна из...

Два потока winapi
Ребят ребят,два потока нужно сделать в проге,вот хотел узнать,это только через WINAPI можно сделать? Нет ли какого нибудь ещё хитрого и...

Два потока и один объект
Всем привет. Пишу игру с физическим движком box2d и возникла проблема , которая в принципе к box2d относится только косвенно, поэтому не...

11
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.03.2010, 09:23
НАверное, нет, они сами закроются.
Здесь читаем
Что происходит при завершении процесса

А происходит вот что.
  1. Выполнение всех потоков в процессе прекращается
0
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 11:05  [ТС]
Процесс:
- выделение ресурсов
- совокупность всех потоков, выполняющих одну задачу
- программный код ...

Разницу между ExitThread и TermirmteThread. То есть каждый поток завершает сам себя ExitThread И программа завершается.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
08.03.2010, 11:13
Возражая предыдущему собеседнику:
Читаем там же:
Завершение процесса

Процесс можно завершить четырьмя способами:
  • входная функция первичного потока возвращает управление (рекомендуемый способ),
  • один из потоков процесса вызывает функцию ExitProcess (нежелательный спо соб);
  • поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно);
  • все потоки процесса умирают по своей воле (большая редкость),
    Я так понимаю, речь идёт именно о четвёртом варианте? Он редок, как мы видим
    Повторюсь: если не отходить от темы разговора, по завершении процесса потоки закроются, пусть ТС об этом не беспокоится.

    Как именно завершится процесс- аварийно, нет ли, щас не об этом пока.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.03.2010, 11:31
Псевдокод для основной функции:

<ввод параметров>

*создание потока*
*создание потока*
*ждём, пока оба потока завершатся*

Вывод printf

завершение программки (потоки закрылись сами, нам их дожидаться не нужно)
0
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 13:01  [ТС]
Где можно достать простеньких примеров по этим потокам? каки нить мелкие исходники?

Добавлено через 1 час 16 минут
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
#include "stdafx.h"
#include <clocale>
#include <math.h>
#include <windows.h>
 
int l, m, n, geo, sum, summa, proivz;
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    printf( "Введите нижнюю границу диапазона(натуральное число): " );
    scanf( "%d", & l );
    printf( "Введите верхнюю границу диапазона(натуральное число): " );
    scanf( "%d", & m );
        if ( l > m )
    {
        printf( "Вводите нормальные числа!\n" );
    }
 
  DWORD idThread;
  HANDLE h1, h2;
 
  h1 = CreateThread (NULL, 0, proizv, geo, 0, &idThread);
  h2 = CreateThread (NULL, 0, summa, sum, 0, &idThread);
 
    getchar();
    getchar();
    return 0;
}
 
DWORD WINAPI proizv (PVOID Parametr)
{
    int n = m-l+1;
    int geo = 1;
       for ( int i = l; i <= m; i++ )
    geo *= i;
    printf("\nПроизведение последовательности: %d", geo);
  return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
    int n = m-l+1;
    int sum = n*((l+m)/2);
    printf(" \n\nСумма последовательности %i", sum);
return 0;
}
Конечно же, программа не работает

1>------ Build started: Project: spo2, Configuration: Debug Win32 ------
1>Compiling...
1>spo2.cpp
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(13) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(15) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(24) : error C2065: 'proizv' : undeclared identifier
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(25) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'int' to 'LPTHREAD_START_ROUTINE'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(43) : error C2365: 'summa' : redefinition; previous definition was 'data variable'
1> c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(6) : see declaration of 'summa'
1>Build log was saved at "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\spo2\spo2\Debug\BuildLog.h tm"
1>spo2 - 3 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.03.2010, 13:16
На эти предупреждения можно не обращать внимания, а функции summa и proizv лучше всё-таки объявить до main.
0
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 13:17  [ТС]
объявил до мейна:

1>------ Build started: Project: spo2, Configuration: Debug Win32 ------
1>Compiling...
1>spo2.cpp
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(20) : error C2365: 'summa' : redefinition; previous definition was 'data variable'
1> c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(6) : see declaration of 'summa'
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(43) : error C2664: 'CreateThread' : cannot convert parameter 4 from 'int' to 'LPVOID'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>c:\documents and settings\admin\мои документы\visual studio 2008\projects\spo2\spo2\spo2.cpp(44) : error C2664: 'CreateThread' : cannot convert parameter 3 from 'int' to 'LPTHREAD_START_ROUTINE'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>Build log was saved at "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\spo2\spo2\Debug\BuildLog.h tm"
1>spo2 - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.03.2010, 13:19
Печать лучше производить в main - записывай результаты в глобальные переменные и печатай уже по завершении потоков.

Добавлено через 41 секунду
А с ошибками ты уж подразберись - зачем объявляешь переменные и функции с одним и тем же именем?

Добавлено через 35 секунд
Ну и наконец, всё-таки лучше дожидаться окончания запущенных в main процессов. Воспользуйся WaitForMultipleObjects.
0
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 13:45  [ТС]
у мея функции summa, proivz
а переменные sum, geo

Добавлено через 18 минут
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
#include "stdafx.h"
#include <clocale>
#include <math.h>
#include <windows.h>
 
int l, m, n, geo, sum;
 
 
DWORD WINAPI proizv (PVOID Parametr)
{
    int n = m-l+1;
    int geo = 1;
       for ( int i = l; i <= m; i++ )
    geo *= i;
  return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
    int n = m-l+1;
    int sum = n*((l+m)/2);
return 0;
}
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    printf( "Введите нижнюю границу диапазона(натуральное число): " );
    scanf( "%d", & l );
    printf( "Введите верхнюю границу диапазона(натуральное число): " );
    scanf( "%d", & m );
        if ( l > m )
    {
        printf( "Вводите нормальные числа!\n" );
    }
 
  DWORD idThread;
  HANDLE h1, h2;
 
  h1 = CreateThread (NULL, NULL, proizv, &geo, NULL, &idThread);
  h2 = CreateThread (NULL, NULL, summa, &sum, NULL, &idThread);
 
    printf("\nПроизведение последовательности: %d", geo);
     printf(" \n\nСумма последовательности %i", sum);
 
    getchar();
    getchar();
    return 0;
}
Итак, компилятор никаких ошибок не вызывает

но! пишется, что сумма (sum) и произведение (geo) равны нулю... пэчаль
помогите исправить)
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.03.2010, 13:49
А может, ты подучишь уже наконец основы языка, на котором пытаешься писать? Разберёшься с тем, что такое функции и переменные, с областями действия, с глобальными переменными и прочим?
Тебе не стыдно, что людям тут приходится подправлять за тобой элементарные ошибки, которые легко разрешаются прочтением хотя бы нескольких глав в учебнике?
C++
1
2
3
4
5
6
DWORD WINAPI summa (PVOID Parametr)
{
        int n = m-l+1;
        int sum = n*((l+m)/2);  // Здесь ты объявляешь ЛОКАЛЬНУЮ sum, которая не имеет никакого отношения к ГЛОБАЛЬНОЙ, объявленной ранее. Убери слово int!
return 0;
}
1
 Аватар для OffyGhost
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 14:11  [ТС]
Программировани на С такое интересное :з

по аналогии исправил

программа работает %)

и кстате да:
C++
1
sum = (n+1)*(l+m)/2;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2010, 14:11
Помогаю со студенческими работами здесь

Сделать в приложении два потока
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;iostream&quot; #include &quot;time.h&quot; #include &quot;cstring&quot; #include &lt;windows.h&gt; #include...

Два потока выводят информацию в консоль
Дана задача: Два потока выводят информацию в консоль. Один выводит время прошедшее с момента запуска ОС, другой позицию курсора...

Найти два максимальных числа из потока
Здравствуйте, нужна ваша помощь. Нужно найти два максимальных числа из одного файла и записать их в другой файл. Сделала так, а опыта и...

Как синхронизировать между собой два потока
Привет, народ. Есть вопросик по потокам. Callback функция постоянно дёргает решатель в отдельном потоке. В примере это цикл в функции...

Два потока читают один и тот же буфер
void priem(char * g) { for (;;Sleep(500)) { printf(&quot;%s\n&quot;, g); } } int main() {


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru