Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

Функция класса в потоке - C++
Здравствуйте, не как не могу запустить функцию класса в потоке. Длею так. прототип void Tcp_Process(); ...

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

Нужно чтобы в потоке не было обращения к визуальным компонентам - Delphi
Ребят выполнить вот это действие в потоке procedure TForm1.Button1Click(Sender: TObject); var i:integer; s:string; begin ...

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

Потоки, эвенты, делегаты. Преобразовать код так, чтобы функция вызывалась в отдельном потоке - C#
доброго времени суток. изначально была функция, которая выглядит примерно вот так: public MyModel ReturnList( int id ) { ...

29
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:34  [ТС] #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, а код весь? И код ошибки?
код очень огромный там 8 классов)) а ошибка типо переменная a не определена
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:35 #17
Мыша, ну значит не определена, определи ее. Я без кода ничегошеньки сказать не могу. Не экстрасенс.
0
Мыша
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;
}
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:38 #19
А что такое "a" по вашему?
1
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:40  [ТС] #20
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
черртт все спать)) мозги кипят)))

Добавлено через 21 секунду
Цитата Сообщение от Kgfq Посмотреть сообщение
А что такое "a" по вашему?
понятно)) без разницы какое оно принимает значение?
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:43 #21
Мыша, ну почему же. Т.к. глобальными данными лучше не орудовать, то передать нужно указатель на некие локальные данные, которые хотите кинуть в поток. В данном случае _Process - это метод некоего класса. Тогда вам нужно передать в поток указатель на объект этого класса и уже из объекта вызывать метод
0
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
29.01.2013, 23:46  [ТС] #22
Цитата Сообщение от Kgfq Посмотреть сообщение
Мыша, ну почему же. Т.к. глобальными данными лучше не орудовать, то передать нужно указатель на некие локальные данные, которые хотите кинуть в поток. В данном случае _Process - это метод некоего класса. Тогда вам нужно передать в поток указатель на объект этого класса и уже из объекта вызывать метод
ага ясно, тоесть &a это указатель на некие данные к вызываемой процедуре\функции?
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
29.01.2013, 23:48 #23
Ну как бы да. В вашем случае вам нужно вызвать A::Process. Причем вызываете вы из объекта A. Тогда имеет смысл передать туда this, там привести void* к A* и вызвать Process как метод этого самого A*
0
Мыша
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 день мучаю код.... с потоками не работал.. заставили(
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.01.2013, 00:03 #25
Мыша, может std::thread? это с++ поток. в 12 студии он есть.
Если интересно, могу пример дать
1
Мыша
4 / 4 / 0
Регистрация: 03.03.2011
Сообщений: 192
30.01.2013, 00:04  [ТС] #26
Цитата Сообщение от I.M. Посмотреть сообщение
Мыша, может std::thread? это с++ поток. в 12 студии он есть.
Если интересно, могу пример дать
давайте... и объясните как в него функцию запустить
0
I.M.
565 / 548 / 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;
}
1
Мыша
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);
0
DiffEreD
1431 / 768 / 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;
}
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.01.2013, 15:43 #30
Мыша, this можно передавать.
this доступен только внутри класса. А в вашем коде this где-то снаружи торчит
0
30.01.2013, 15:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2013, 15:43
Привет! Вот еще темы с ответами:

Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке - C#
Здравствуйте! Я делаю лабу сервер распределенных вычислений в сети. В одном потоке ожидаю клиентов и на каждого клиента создаю поток. ...

GDI+. Почему в отдельном потоке картинки сохраняются как белые прямоугольники, а в основном потоке - всё Ок? - Delphi
Всем привет, делаю функцию уменьшения картинок при помощи библиотеки GDI+, в отдельном потоке происходит уменьшение картинки и её...

Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке - C#
Привет :) Есть задача - нужно динамически добавлять компоненты. Все работает хорошо. Но если добавлять через цикл то начинает зависать...

Таймер не запускается в отдельном потоке - C#
У меня есть поток, в котором в при определенных условиях должен запустится таймер, но он почему то не запускается. Вот упрощенный...


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

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

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