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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
29.01.2013, 22:51     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #1
хм.. не могу создать поток в c++ и направить туда. Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2013, 22:51     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
Посмотрите здесь:

C++ Вот я создал фунцкцию...и немогу направить в менюшку чтоб она там работала!!
C++ Функция в потоке
Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. C++
C++ Готовая программа, нужно переделать ее чтобы она работала с УКАЗАТЕЛЯМИ
C++ Функция класса в потоке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 22:54     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #2
компилятор у вас какой?
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
29.01.2013, 22:56  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #3
Цитата Сообщение от Kgfq Посмотреть сообщение
компилятор у вас какой?
стандартный на visual studio 2012
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:03     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #4
Мыша, тогда process.h и _beginthread в помощь
grindaah
20 / 20 / 0
Регистрация: 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 (какое-то условие)
    что-то там делает
}
Kgfq
74 / 37 / 2
Регистрация: 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;
}
grindaah
20 / 20 / 0
Регистрация: 25.05.2011
Сообщений: 62
29.01.2013, 23:07     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #7
Ps #include <windows.h>
pps думаю все же апишные вызовы подразумеваются
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
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");
 
}
зачем нам это?
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:17     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #9
Мыша, всего лишь что бы программа не вышла после завершения.
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
29.01.2013, 23:20  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #10
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, всего лишь что бы программа не вышла после завершения.
ясно, а вот мне нужно запустить функцию где параметры не void *data и как работает _beginthread
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:22     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #11
Мыша, _beginthread запускает только функции вида void name(void *). А уже из этого потока запустите нужную
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
29.01.2013, 23:29  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #12
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, _beginthread запускает только функции вида void name(void *). А уже из этого потока запустите нужную
тоесть просто вызвать нужную функцию ? вот так?
C++
1
2
3
4
void f(void *data)
{
   _process();
}
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:31     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #13
Мыша, да

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

Добавлено через 36 секунд
Мыша, 2 поток работает параллельно с основным. Почти все, что можно в основном - можно и в параллельном
_beginthread(f, 0, &a); ругаеться на &a
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:33     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #15
Мыша, а код весь? И код ошибки?
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
29.01.2013, 23:34  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, а код весь? И код ошибки?
код очень огромный там 8 классов)) а ошибка типо переменная a не определена
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:35     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #17
Мыша, ну значит не определена, определи ее. Я без кода ничегошеньки сказать не могу. Не экстрасенс.
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
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;
}
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:38     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #19
А что такое "a" по вашему?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 23:40     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
Еще ссылки по теме:

Преобразовать формулу в C++, что бы она там работала C++
Не могу создать файл в поток ofstream C++
Как создать объект класса в потоке? C++

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

Или воспользуйтесь поиском по форуму:
Мыша
 Аватар для Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 189
29.01.2013, 23:40  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #20
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
черртт все спать)) мозги кипят)))

Добавлено через 21 секунду
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
понятно)) без разницы какое оно принимает значение?
Yandex
Объявления
29.01.2013, 23:40     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
Ответ Создать тему
Опции темы

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