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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 05:19     Два потока в одной программе #1
Две фунцкии одной программы оформить как две функции потока. После ввода значений запускаются два требуемых потока, а потом на экран выводится полученные значения.

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

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

*создание потока*
-работае кусок программы в потоке
*создание потока*
-работает кусок программы в потоке
Вывод printf
завершение программки (нужно ли еще закрыть потоки?)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
08.03.2010, 09:23     Два потока в одной программе #2
НАверное, нет, они сами закроются.
Здесь читаем
Что происходит при завершении процесса

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

Разницу между ExitThread и TermirmteThread. То есть каждый поток завершает сам себя ExitThread И программа завершается.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
08.03.2010, 11:13     Два потока в одной программе #4
Возражая предыдущему собеседнику:
Читаем там же:
Завершение процесса

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

    Как именно завершится процесс- аварийно, нет ли, щас не об этом пока.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
08.03.2010, 11:31     Два потока в одной программе #5
Псевдокод для основной функции:

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

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

Вывод printf

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

Добавлено через 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.htm"
1>spo2 - 3 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
08.03.2010, 13:16     Два потока в одной программе #7
На эти предупреждения можно не обращать внимания, а функции summa и proizv лучше всё-таки объявить до main.
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 13:17  [ТС]     Два потока в одной программе #8
объявил до мейна:

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.htm"
1>spo2 - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
08.03.2010, 13:19     Два потока в одной программе #9
Печать лучше производить в main - записывай результаты в глобальные переменные и печатай уже по завершении потоков.

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

Добавлено через 35 секунд
Ну и наконец, всё-таки лучше дожидаться окончания запущенных в main процессов. Воспользуйся WaitForMultipleObjects.
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 13:45  [ТС]     Два потока в одной программе #10
у мея функции 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) равны нулю... пэчаль
помогите исправить)
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
08.03.2010, 13:49     Два потока в одной программе #11
А может, ты подучишь уже наконец основы языка, на котором пытаешься писать? Разберёшься с тем, что такое функции и переменные, с областями действия, с глобальными переменными и прочим?
Тебе не стыдно, что людям тут приходится подправлять за тобой элементарные ошибки, которые легко разрешаются прочтением хотя бы нескольких глав в учебнике?
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2010, 14:11     Два потока в одной программе
Еще ссылки по теме:

C++ Согласовать два потока для вывода номера по порядку
Сделать все задание в одной программе) C++
C++ Найти два максимальных числа из потока

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

Или воспользуйтесь поиском по форуму:
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
08.03.2010, 14:11  [ТС]     Два потока в одной программе #12
Программировани на С такое интересное :з

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

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

и кстате да:
C++
1
sum = (n+1)*(l+m)/2;
Yandex
Объявления
08.03.2010, 14:11     Два потока в одной программе
Ответ Создать тему
Опции темы

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