Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Поток: вернуть результат выполния функции


Автор: Alca 4.10.2007, 11:52
Поток: вернуть результат выполнения функции


Код

//---------------------------------------------------------------------------
//объявление в классе TfrmMain
public:
    AnsiString asResult;

//---------------------------------------------------------------------------
static DWORD __stdcall MyNotifyThread(void *) {
    while (true) {
        DWORD dwId;
        int iResult = pList->C_WaitForSlotEvent(0, &dwId, 0);
        
        if (iResult == OK) {
            AnsiString asTmp = "";
            asTmp = MyClass->GetSomething(); //метод класса MyClass   
            //здесь asTmp видно
            //MessageBox(NULL, asTmp.c_str(), "MyNotifyThread!", 0 | 48 | 0 | 0 | 262144);
        } else {
            break;
        }
    }
    return 0;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnStartClick(TObject *Sender) {
    DWORD dwId;
    hThread = CreateThread(NULL, 0, MyNotifyThread, 0, 0, &dwId);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnResultClick(TObject *Sender) {
    //сюда вывести результат
    //здесь asTmp не видно
    MessageBox(NULL, asResult.c_str(), "", 0 | 48 | 0 | 0 | 262144);
}
//---------------------------------------------------------------------------

Автор: zkv 4.10.2007, 12:03
Цитата(Alca @  4.10.2007,  11:52 Найти цитируемый пост)
   asTmp = MyClass->GetSomething(); //метод класса MyClass   

как это, не может быть  MyClass  классом,   вероятно ты имел ввиду указатель на объект?
где он тогда объявлен?

По идее в MyNotifyThread нужно передавать указатель на объект класса, который будет потоком обрабатываться.

Автор: Alca 4.10.2007, 12:08
MyClass - указатель на объект

Автор: zkv 4.10.2007, 12:20
Цитата(Alca @  4.10.2007,  12:08 Найти цитируемый пост)
MyClass - указатель на объект

был вопрос:
Цитата(zkv @  4.10.2007,  12:03 Найти цитируемый пост)
где он тогда объявлен?

и пояснение принципа работы:
Цитата(zkv @  4.10.2007,  12:03 Найти цитируемый пост)

По идее в MyNotifyThread нужно передавать указатель на объект класса, который будет потоком обрабатываться. 


Автор: Alca 4.10.2007, 12:59
Код

#include "CmyClass.h"

CMyClass   *MyClass;  

static DWORD __stdcall MyNotifyThread(void *);

//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) {
    MyClass = new CMyClass();
}
//---------------------------------------------------------------------------
__fastcall TfrmMain::~TfrmMain() {
    delete MyClass;
}

Автор: zkv 4.10.2007, 13:11
передать парамтры из потока можно примерно так:
Код

public:
    AnsiString asResult;
//---------------------------------------------------------------------------
static DWORD __stdcall MyNotifyThread(void *param) {
    TfrmMain *pThis = static_cast<TfrmMain *>(param);
    //проверить pThis
    while (true) {
        DWORD dwId;
        int iResult = pList->C_WaitForSlotEvent(0, &dwId, 0);
        
        if (iResult == OK) {
            AnsiString asTmp = "";
            asTmp = MyClass->GetSomething(); //метод класса MyClass   
            pThis->asResult = asTmp;
            //здесь asTmp видно
            //MessageBox(NULL, asTmp.c_str(), "MyNotifyThread!", 0 | 48 | 0 | 0 | 262144);
        } else {
            break;
        }
    }
    return 0;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnStartClick(TObject *Sender) {
    DWORD dwId;
    hThread = CreateThread(NULL, 0, MyNotifyThread, this, 0, &dwId);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnResultClick(TObject *Sender) {
    //сюда вывести результат
    //здесь asTmp не видно
    MessageBox(NULL, asResult.c_str(), "", 0 | 48 | 0 | 0 | 262144);
}


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

Добавлено через 1 минуту и 2 секунды
где то мог ошибиться, но суть должна быть ясна  smile 

Автор: Alca 4.10.2007, 13:32
Всё равно в asResult пусто:
Код

void __fastcall TfrmMain::btnResultClick(TObject *Sender) {
    //сюда вывести результат
    //всё равно здесь asResult не видно
    MessageBox(NULL, asResult.c_str(), "", 0 | 48 | 0 | 0 | 262144);
}

Автор: zkv 4.10.2007, 13:36
Цитата(Alca @  4.10.2007,  13:32 Найти цитируемый пост)
здесь asTmp не видно

неудивительно, это же локальная переменная.
должно в asResult прийти.
для чего я делал:
Цитата(zkv @  4.10.2007,  13:11 Найти цитируемый пост)
 pThis->asResult = asTmp;

Автор: Alca 4.10.2007, 13:41
Сорри отредактировал...
Код

void __fastcall TfrmMain::btnResultClick(TObject *Sender) {
    //сюда вывести результат
    //всё равно здесь asResult не видно
    MessageBox(NULL, asResult.c_str(), "", 0 | 48 | 0 | 0 | 262144);
}

asResult - в паблик секции класса

Автор: zkv 4.10.2007, 13:47
возможно строка затирается на следующих итерациях цикла, возможно на момент вызова метода поток еще не отработал (WaitForSingleObject - делаем?), еще чего-нить... Смотри, ищи...

Автор: Alca 4.10.2007, 13:55
а куда вставить WaitForSingleObject?
таки затирается! я присвоил asResult строку "xxxxxxxx", - затёрлась

Автор: zkv 4.10.2007, 14:01
Цитата(Alca @  4.10.2007,  13:55 Найти цитируемый пост)
а куда вставить WaitForSingleObject? 

туда, где нужно быть уверенным, что поток отработал.
У тебя видимо это обработчик нажатия кнопки. 
Почитай MSDN по WaitForSingleObject(), там даже пример был вроде.

Ну и сделай в своем потоке трассировку значений asResult.
В MFC для этого удобен макрос TRACE(), в билдере тоже должно быть что-то.

и не забывай про это:
Цитата(zkv @  4.10.2007,  13:11 Найти цитируемый пост)
где то мог ошибиться, но суть должна быть ясна 

 smile 

Автор: Alca 4.10.2007, 16:16
Обошлось без WaitForSingleObject:
Так не пашет:
Код

ShowMessage(asResult);

помогло

Так пашет:
Код

ShowMessage(asResult.c_str());


Спасибо! zkv!!!!!!!!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)