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

Как передать функцию в Thread()? - C++

Восстановить пароль Регистрация
 
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
21.09.2011, 17:25     Как передать функцию в Thread()? #1
Привет, всем.

У меня есть простенькая программка состоящая из пару функций. Теперь я хочу передать эти функции в Тhread(), но не знаю, как это сделать, подскажите пожалуйста, как это осуществить, или киньте какой нибудь пример.... причём это должно написано быть в объект ориентирном программирование.
Вот моя программа сейчас.......
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
#include "StdAfx.h"
#include "Byte.h"
 
Byte::Byte(void){bytes = NULL;}
 
Byte::~Byte(void){if (bytes) delete [] bytes;}
 
void Byte::InputString() 
{
while (true)  
  { 
    std::cout << "Enter -> Gib ein Wort ein_: "<<std::endl; 
    std::cin >> str;
    int i  = str.length();
    if (i<0) 
    continue; 
    break; 
  } }
 
void Byte::OutputArray()
{
for (int i=0; i<=str.size(); i++)
    {cout<<str[i]<<"\n";}
    }
void Byte::ConvertArrayToAsci()
{
for (int i=0; i<=str.size(); i++)
    {printf("%x\n",str[i]);}
}
для Thread() надо создавать новую функцию?? Типа void Byte::hThread(), если да, то какие параметры должны стоять в скобках?
Пасиб за ранее.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2011, 17:25     Как передать функцию в Thread()?
Посмотрите здесь:

Как в функцию передать координаты C++
Как передать массив в функцию? C++
C++ Как передать строку в функцию?
C++ как передать sort в thread
как передать массив у функцию? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yulicesar
4 / 4 / 0
Регистрация: 21.09.2011
Сообщений: 20
21.09.2011, 17:41     Как передать функцию в Thread()? #2
нужен код из хидера.
чтобы метод мог работать в потоке, он должен быть статическим (static).
параметр - один типа void*, в твоем случае он фиктивный. то есть просто напиши его в декларации методов но не используй
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
21.09.2011, 17:54  [ТС]     Как передать функцию в Thread()? #3
я не совсем поняла ответ...
это мой хедер.............
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Byte
{
public:
 
    Byte(void) ;
    ~Byte(void);
    void InputString();
    void OutputArray();
    void ConvertArrayToAsci();
// в этом месте добавить??
statik startThread(void)
 
private:
    string str;
    char* bytes;
};
мне 2 Thread() надо??
yulicesar
4 / 4 / 0
Регистрация: 21.09.2011
Сообщений: 20
21.09.2011, 18:01     Как передать функцию в Thread()? #4
какой именно метод в треде надо запускать?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
21.09.2011, 18:54     Как передать функцию в Thread()? #5

Не по теме:

Цитата Сообщение от Sikorskaja Посмотреть сообщение
statik
убило



какие thread'ы ты вообще используешь?
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
21.09.2011, 19:47  [ТС]     Как передать функцию в Thread()? #6
а что бывают разные, задание такое.......
запустить функции с помощью Thread, сначала один Тhread, по окончанию первого другой....
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
21.09.2011, 20:51     Как передать функцию в Thread()? #7
вы вообще где пишете то?
эти треды есть в qt, boost, .net, атакже стандартные posix и windows потоки
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
21.09.2011, 21:28     Как передать функцию в Thread()? #8
Цитата Сообщение от yulicesar Посмотреть сообщение
нужен код из хидера.
чтобы метод мог работать в потоке, он должен быть статическим (static).
параметр - один типа void*, в твоем случае он фиктивный. то есть просто напиши его в декларации методов но не используй
поясните пожалуйста вашу мысль.
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
22.09.2011, 11:57  [ТС]     Как передать функцию в Thread()? #9
Цитата Сообщение от sandye51 Посмотреть сообщение
вы вообще где пишете то?
эти треды есть в qt, boost, .net, атакже стандартные posix и windows потоки
VisualStudio2008 тогда наверное Windows потоки

Добавлено через 1 минуту
Цитата Сообщение от yulicesar Посмотреть сообщение
какой именно метод в треде надо запускать?

void OutputArray(); потом void ConvertArrayToAsci();
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
22.09.2011, 12:01     Как передать функцию в Thread()? #10
примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ABC{
    public: 
        void f(); //объявление функции в нужном вам месте.
        void start_thread();
    // что-то еще.
    privat:
        myThread(); 
};
 
void ABC::f()
{ /* какие-то действия */ }
void ABC::myThread(void* ptr){
    f();
        _endthread(); //останов треда
}
void ABC::start_thread()
{
    void* arg_ptr = NULL; //указатель на аргумент. обычно на структуру.
    _beginthread(myThread, 0, arg_ptr); //запуск треда.
}

#include<process.h>, #include<windows.h>
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
22.09.2011, 13:40  [ТС]     Как передать функцию в Thread()? #11
_endthread() и _beginthread(myThread, 0, arg_ptr) эти две функции же надо сначала обозначить или?? Sorry, я никогда ещё толком не программировала, читаю в данный момент литературу....но пока много не принесло..
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
22.09.2011, 14:53     Как передать функцию в Thread()? #12
#include<process.h>
и они у вас будут.
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
22.09.2011, 15:26  [ТС]     Как передать функцию в Thread()? #13
спасибо огромное за пример... сделав так как вы мне Объяснили, у меня получился такой код
это Byte.h файл
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
#pragma once
#include <iostream>
#include <string>
#include <stdio.h>
#include<process.h>  //fГјr _endthread() //
#include<windows.h>
 
using namespace std;
 
 
class Byte
{
public:
 
    Byte(void) ;
    ~Byte(void);
    void InputString();
    void OutputArray();
    void ConvertArrayToAsci();
 
    void Start_Thread();
 
private:
    string str;
    char* bytes;
    myThread();
};
это Byte.cpp
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 "Byte.h"
 
Byte::Byte(void)
{
bytes = NULL;
}
 
Byte::~Byte(void)
{
if (bytes) delete [] bytes;
}
 
void Byte::InputString() 
{
    while (true) 
  { 
    std::cout << "Enter -> Gib ein Wort ein_: "<<std::endl;
    std::cin >> str;
    int i  = str.length();
    if (i<0) 
    continue; 
    break; 
  } 
}
 
void Byte::OutputArray()
{
for (int i=0; i<=str.size(); i++)
    {cout<<str[i]<<"\n";}
}
 
void Byte::ConvertArrayToAsci()
{   
    for (int i=0; i<=str.size(); i++)
    {printf("%x\n",str[i]);}
}
 
void Byte::myThread(void* ptr)
{    
    OutputArray();
    _endthread();
}
 
void Start_Thread()
{
    void* arg_ptr = NULL; //указатель на аргумент. обычно на структуру.
    _beginthread(myThread, 0, arg_ptr); //Thread fГ¤ngt an
    ConvertArrayToAsci();
}
и передача этих функций в Main()
C++
1
2
3
4
5
Byte obj;
        
        obj.InputString();
        obj.myThread();
        obj.Start_Thread();
на этот "чудо-код" вылазит целая куча ошибок.....
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
22.09.2011, 15:57     Как передать функцию в Thread()? #14
касательно кода: так не получится =). Во первых, если вы объявляете myThread() как приват, то обращаться к нему "из вне" не получится. Почитайте что-нибудь обзорное по этой теме.

во-вторых, смотрите что происходит:
есть процесс - ваша программа. Процесс содержит основной трэд (основной поток процесса). В методе Start_Thread() происходит порождение дополнительного трэда, замечательно. Теперь есть процесс и два трэда - основной и порожденный, они (трэды) работают параллельно. И происходит следующее: в то время как основной трэд конвертирует строку, порожденный начинает выводить эту же строку. Как они отработают, который закончит раньше, что получится в результате - предсказать не возможно. В принципе в данном случае задача не расспараллеливается, ибо сначала нужно ввести, потом обработать, потом вывести. Расспараллелить можно обработку - т.е. заменить реализацию ConvertArrayToAnsi на многопоточную. Например: один поток обрабатывает левую половину строки, второй - правую.
замечание: хорошо бы прочесть что-нибудь о доступе к членам класса. О том в чем разница между процессом и потоком в вин хорошо написано у Рихтера (windows для проффесионалов - в инете есть).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 13:31     Как передать функцию в Thread()?
Еще ссылки по теме:

C++ Как передать массив в функцию?
Как передать параметр в функцию? C++
Как передать функцию в функцию? C++

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

Или воспользуйтесь поиском по форуму:
Sikorskaja
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 8
27.09.2011, 13:31  [ТС]     Как передать функцию в Thread()? #15
Ok, я вроде-бы разобралась с потоками, во всяком случае ошибка больше не выходит, но теперь следующая проблема, потоки идут параллельно, первая функция выполняется и не доходя до конца начинает уже вторая своё действие, по этому на экране выводятся 2 функции вперемешку, а не по очереди. Я слышала что потоки можно контролировать с помощью AutoResetEvent. Как эту функцию в моём коде задействовать?
Вот мой cpp-File
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
#include "StdAfx.h"
#include "Byte.h"
 
Byte::Byte(void)
{bytes = NULL;}
 
Byte::~Byte(void)
{if (bytes) delete [] bytes;}
 
void Byte::InputString() 
{
    while (true) 
  { 
    std::cout << "Enter -> Gib ein Wort ein_: "<<std::endl;
    getline(cin,str);
    int i  = str.length();
    if (i<1) 
    continue; 
    break; 
  } 
 
}
 
void Byte::OutputArray()
{
    for (int i=0; i<str.length(); i++)
 
       {cout<<str[i]<<"\n";}
}
 
void Byte::ConvertArrayToAsci()
{   
    for (int i=0; i<str.size(); i++)
    {
        printf("%x\n",str[i]);
    }
}
 
unsigned __stdcall Byte::myThread(void* ptr)
{    
cout<<"test5 ";
    Byte* mobj = reinterpret_cast<Byte*>(ptr);  
    mobj->OutputArray();
    _endthreadex(0);
    return(0);
}
#
void Byte::Start_Thread()
{
    void* arg_ptr = this; //указатель на аргумент. обычно на структуру.
    HANDLE hThread;
    unsigned threadID;
    hThread = (HANDLE)_beginthreadex(NULL, 0, myThread, arg_ptr, 0, &threadID);
    ConvertArrayToAsci();
}
Yandex
Объявления
27.09.2011, 13:31     Как передать функцию в Thread()?
Ответ Создать тему
Опции темы

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