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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
#1

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

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

хм.. не могу создать поток в c++ и направить туда. Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2013, 22:51     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
Посмотрите здесь:
C++ Функция в потоке
C++ Функция класса в потоке
Как создать объект класса в потоке? C++
C++ Как сделать, чтобы параллельно с функцией main работала другая функция?
C++ Готовая программа, нужно переделать ее чтобы она работала с УКАЗАТЕЛЯМИ
Преобразовать формулу в C++, что бы она там работала C++
C++ Вот я создал фунцкцию...и немогу направить в менюшку чтоб она там работала!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
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
Сообщений: 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;
}
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:38     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #19
А что такое "a" по вашему?
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:40  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #20
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
черртт все спать)) мозги кипят)))

Добавлено через 21 секунду
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
понятно)) без разницы какое оно принимает значение?
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:43     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #21
Мыша, ну почему же. Т.к. глобальными данными лучше не орудовать, то передать нужно указатель на некие локальные данные, которые хотите кинуть в поток. В данном случае _Process - это метод некоего класса. Тогда вам нужно передать в поток указатель на объект этого класса и уже из объекта вызывать метод
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:46  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #22
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, ну почему же. Т.к. глобальными данными лучше не орудовать, то передать нужно указатель на некие локальные данные, которые хотите кинуть в поток. В данном случае _Process - это метод некоего класса. Тогда вам нужно передать в поток указатель на объект этого класса и уже из объекта вызывать метод
ага ясно, тоесть &a это указатель на некие данные к вызываемой процедуре\функции?
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:48     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #23
Ну как бы да. В вашем случае вам нужно вызвать A::Process. Причем вызываете вы из объекта A. Тогда имеет смысл передать туда this, там привести void* к A* и вызвать Process как метод этого самого A*
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:54  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #24
Цитата Сообщение от Kgfq Посмотреть сообщение
Ну как бы да. В вашем случае вам нужно вызвать A::Process. Причем вызываете вы из объекта A. Тогда имеет смысл передать туда this, там привести void* к A* и вызвать Process как метод этого самого A*
чет туплю... хмм смотрите
C++
1
2
3
4
5
void CEngine::_Process()
{
    _Frame+=0.2; // =========== Only for testing ==============
    _Running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED);
}
не могу понять как передать в поток указатель на объект.....
З.Ы это реальизовать и все.. уже 3 день мучаю код.... с потоками не работал.. заставили(
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.01.2013, 00:03     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #25
Мыша, может std::thread? это с++ поток. в 12 студии он есть.
Если интересно, могу пример дать
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
30.01.2013, 00:04  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #26
Цитата Сообщение от I.M. Посмотреть сообщение
Мыша, может std::thread? это с++ поток. в 12 студии он есть.
Если интересно, могу пример дать
давайте... и объясните как в него функцию запустить
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.01.2013, 00:12     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <thread>
 
void some_function(int a, char b)
{
}
 
class some_class
{
public:
   void some_method(const std::string& i_string)
   {      
   }
};
 
int main()
{
   std::thread t1(some_function, 42, 'h'); // создание и запуск потока 1
   
   some_class value;
   std::thread t2(&some_class::some_method, &value, "hello world"); // создание и запуск потока 2
   return 0;
}
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
30.01.2013, 11:11  [ТС]     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #28
Цитата Сообщение от I.M. Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <thread>
 
void some_function(int a, char b)
{
}
 
class some_class
{
public:
   void some_method(const std::string& i_string)
   {      
   }
};
 
int main()
{
   std::thread t1(some_function, 42, 'h'); // создание и запуск потока 1
   
   some_class value;
   std::thread t2(&some_class::some_method, &value, "hello world"); // создание и запуск потока 2
   return 0;
}

а можно так
C++
1
2
3
4
5
6
7
8
class some_class
{
public:
   void some_method()
   {      
   }
};
 std::thread t2(&some_class::some_method, this);
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.01.2013, 13:12     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #29
Мыша, можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class some_class
{
public:
    some_class() {std::cout<<"constructor called\n";}
    void some_method() const {std::cout<<"some_method\n";}
    static void some_other_method() {std::cout<<"some_other_method\n";}
};
 
int main()
{
    std::thread t1(&some_class::some_method, &some_class());
    std::thread t2(&some_class::some_other_method);
    t1.join();
    t2.join();
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2013, 15:43     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
Еще ссылки по теме:
Не могу создать файл в поток ofstream C++
rand() в потоке C++
C++ rand() в потоке
C++ Rand() в потоке
C++ Вызов метода в потоке

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

Или воспользуйтесь поиском по форуму:
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.01.2013, 15:43     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) #30
Мыша, this можно передавать.
this доступен только внутри класса. А в вашем коде this где-то снаружи торчит
Yandex
Объявления
30.01.2013, 15:43     Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке)
Ответ Создать тему
Опции темы

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