Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
#1

Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)

29.01.2013, 22:51. Просмотров 1219. Ответов 29
Метки нет (Все метки)

хм.. не могу создать поток в c++ и направить туда. Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2013, 22:51
Ответы с готовыми решениями:

Как удалить поток в потоке
Добрый день всем! Идейно маленькая часть кода std::vector<std::thread>...

Функция в потоке
Помогите разобраться с потоками : void F(bool x, int i, bool y) {} ...

Функция класса в потоке
Здравствуйте, не как не могу запустить функцию класса в потоке. Длею так. ...

Создать приложение, в отдельном потоке вычисляющее значение w и непрерывно обновляющее его в потоке
Ребят, с потоками не работал не когда. Есть задание , я понимаю что хотят, а...

Нужно чтобы в потоке не было обращения к визуальным компонентам
Ребят выполнить вот это действие в потоке procedure...

29
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 22:54 #2
компилятор у вас какой?
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 22:56  [ТС] #3
Цитата Сообщение от Kgfq Посмотреть сообщение
компилятор у вас какой?
стандартный на visual studio 2012
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:03 #4
Мыша, тогда process.h и _beginthread в помощь
0
grindaah
20 / 20 / 3
Регистрация: 25.05.2011
Сообщений: 62
29.01.2013, 23:04 #5
А что именно не получается?

C++
1
2
3
4
5
6
HANDLE thread1;
 
thread1 = ::CreateThread(NULL, 0, 
                                    thread_handler
                      , 0
                      , 0, NULL);
где thread_handler - функция вида:

C++
1
2
3
4
5
DWORD WINAPI thread_handler(LPVOID lpParam)
{
while (какое-то условие)
    что-то там делает
}
1
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:06 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <process.h>
 
void f(void *data)
{
    std::cout << "yep " << *(int*)data << std::endl;
}
 
int main()
{
    int a = 2;
    _beginthread(f, 0, &a);
    system("pause");
    return 0;
}
1
grindaah
20 / 20 / 3
Регистрация: 25.05.2011
Сообщений: 62
29.01.2013, 23:07 #7
Ps #include <windows.h>
pps думаю все же апишные вызовы подразумеваются
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:11  [ТС] #8
Цитата Сообщение от grindaah Посмотреть сообщение
А что именно не получается?

C++
1
2
3
4
5
6
HANDLE thread1;
 
thread1 = ::CreateThread(NULL, 0, 
                                    thread_handler
                      , 0
                      , 0, NULL);
где thread_handler - функция вида:

C++
1
2
3
4
5
DWORD WINAPI thread_handler(LPVOID lpParam)
{
while (какое-то условие)
    что-то там делает
}
а можно поподробнее о thread_handler, тоесть как запустить поток? и передать туда функцию?

Добавлено через 51 секунду
Цитата Сообщение от Kgfq Посмотреть сообщение
C++
1
2
3
    system("pause");
 
}
зачем нам это?
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:17 #9
Мыша, всего лишь что бы программа не вышла после завершения.
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:20  [ТС] #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, всего лишь что бы программа не вышла после завершения.
ясно, а вот мне нужно запустить функцию где параметры не void *data и как работает _beginthread
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:22 #11
Мыша, _beginthread запускает только функции вида void name(void *). А уже из этого потока запустите нужную
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:29  [ТС] #12
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, _beginthread запускает только функции вида void name(void *). А уже из этого потока запустите нужную
тоесть просто вызвать нужную функцию ? вот так?
C++
1
2
3
4
void f(void *data)
{
   _process();
}
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:31 #13
Мыша, да

Добавлено через 36 секунд
Мыша, 2 поток работает параллельно с основным. Почти все, что можно в основном - можно и в параллельном
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:32  [ТС] #14
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, да

Добавлено через 36 секунд
Мыша, 2 поток работает параллельно с основным. Почти все, что можно в основном - можно и в параллельном
_beginthread(f, 0, &a); ругаеться на &a
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:33 #15
Мыша, а код весь? И код ошибки?
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:34  [ТС] #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, а код весь? И код ошибки?
код очень огромный там 8 классов)) а ошибка типо переменная a не определена
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:35 #17
Мыша, ну значит не определена, определи ее. Я без кода ничегошеньки сказать не могу. Не экстрасенс.
0
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:36  [ТС] #18
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, ну значит не определена, определи ее. Я без кода ничегошеньки сказать не могу. Не экстрасенс.
вот

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "Engine.h"
#include "glfw.h"
#include <iostream>
#include <process.h>
 
void GLFWCALL WindowResize( int width, int height );
 
CEngine::CEngine(string Title)
    :_Width(800), _Height(600), _c_WindowTitle(Title.c_str())
{
    _WindowInit();
    _OpenGLInit();
    SetProcessPerSecond(75);
    try{
    _Map.LoadMap("simple");
    _Map.LoadFrom3ds("data/models/Flyer.3ds");
    }
    catch (CException *e)
    {
        cout << e->GetMessage() << endl;
        delete e;
    }
}
 
CEngine::~CEngine()
{
}
 
void CEngine::_OpenGLInit()
{
    glViewport( 0, 0, _Width, _Height );
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    gluPerspective( 65.0f, (GLfloat)_Width/(GLfloat)_Height, 1.0f, 100.0f );
    glMatrixMode( GL_MODELVIEW );
 
    GLfloat AmbientLight[4] = {0.5, 0.5, 0.5, 1.0};
    GLfloat DiffuseLight[4] = {1.0, 1.0, 1.0, 1.0};
    GLfloat SpecularLight[4] = {1.0, 1.0, 1.0, 1.0};
    GLfloat LightPosition[4] = {0.0, 1.0 ,0.0 ,2.0};
    GLfloat SpecularReflection[4] = {0.4, 0.4, 0.4, 1.0};
 
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0,GL_AMBIENT, (const GLfloat*)&AmbientLight);
    glLightfv(GL_LIGHT0,GL_DIFFUSE, (const GLfloat*)&DiffuseLight);
    glLightfv(GL_LIGHT0,GL_SPECULAR, (const GLfloat*)&SpecularLight);
 
    glLightfv(GL_LIGHT0,GL_POSITION,(const GLfloat*)&LightPosition);
 
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glMaterialfv(GL_FRONT, GL_SPECULAR, (const GLfloat*)&SpecularReflection);
    glMateriali(GL_FRONT,GL_SHININESS,100);
}
 
void CEngine::_Draw()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
    // =========== Only for testing ==============
    glTranslatef(0,0,-3);
    glRotatef(_Frame,0,1,1);
    // =========== Only for testing ==============
    _Map.Draw();
    for(int i = 0;i < _Vehicles.size();i++) _Vehicles[i].Draw();
    glfwSwapBuffers();
}
 
void CEngine::_Process()
{
    _Frame+=0.2; // =========== Only for testing ==============
    _Running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED);
}
 
void CEngine::SetProcessPerSecond(int Times)
{
    _ProcessPerSecond = 1.0/Times;
}
 
void f(void *data)
{
    _Process();
}
 
void CEngine::MainLoop()
{
    _Frame = 0;// =========== Only for testing ==============
    _Running = true;
    double dTime = glfwGetTime();
    while (_Running)
    {
        _Draw();
 
        _beginthread(f, 0, &a);
        
        dTime = glfwGetTime();
        
    }
    glfwTerminate();
}
 
void GLFWCALL WindowResize( int width, int height )
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f);
    glMatrixMode( GL_MODELVIEW );
}
 
void CEngine::_Collision()
{
    for (int i = 0; i < _Vehicles.size(); i++)
    {
        // Collision detection between vehicles
        for (int j = 0; j < _Vehicles.size(); j++)
        {
            TVector3d distance = _Vehicles[i].GetPosition() - _Vehicles[j].GetPosition();
            float min_distance = _Vehicles[i].GetRadius() + _Vehicles[j].GetRadius();
            if (distance.LengthSquared() <= min_distance * min_distance)
            {
                /* Collision detected!
                ** TODO: reduce vehicles life
                ** FIXED: compute new velocity vector
                */
                // p = mv;  Ek = mv^2/2
                TVector3d v1 = _Vehicles[i].GetVelocity();
                int       m1 = _Vehicles[i].GetWeight();
                TVector3d v2 = _Vehicles[j].GetVelocity();
                int       m2 = _Vehicles[j].GetWeight();
 
                _Vehicles[i].SetVelocity((v1 * (m1 - m2) + v2 * m2 * 2) * (1/(m1 + m2)));
                _Vehicles[j].SetVelocity((v2 * (m2 - m1) + v1 * m1 * 2) * (1/(m1 + m2)));
            }
        }
        /*
        ** TODO: Collision detection beween vehicle and other static objects e.g. walls
        ** TODO: Make sure you use square instead of square root everywhere where it possible
        */
    }
}
 
void CEngine::_WindowInit()
{
    glfwInit();
    glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
    if( !glfwOpenWindow( _Width,_Height, 0, 0, 0, 0, 24, 0, GLFW_WINDOW ) )
    {
        glfwTerminate();
    }
    glfwSetWindowTitle(_c_WindowTitle);
    glfwSetWindowSizeCallback( WindowResize );
    glfwGetWindowSize( &_Width, &_Height);
    _Height = _Height > 0 ? _Height : 1;
}
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:38 #19
А что такое "a" по вашему?
1
Мыша
4 / 4 / 2
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:40  [ТС] #20
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
черртт все спать)) мозги кипят)))

Добавлено через 21 секунду
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
понятно)) без разницы какое оно принимает значение?
0
29.01.2013, 23:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 23:40

Что нужно изменить, чтобы процедура запускалась с параметрами в новом потоке?
Ошибка на 10 строке: Ожидалась функция, встречена процедура ADD Что нужно...

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

Поток в потоке
Здравствуйте, уважаемые! С потоками работаю крайне редко, а если и работаю,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru