Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поток: вернуть результат выполния функции 
V
    Опции темы
Alca
Дата 4.10.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Поток: вернуть результат выполнения функции


Код

//---------------------------------------------------------------------------
//объявление в классе 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);
}
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) Alca - 4.10.2007, 11:54


--------------------
PM WWW ICQ Skype Jabber   Вверх
zkv
Дата 4.10.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



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

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

По идее в MyNotifyThread нужно передавать указатель на объект класса, который будет потоком обрабатываться.
PM MAIL   Вверх
Alca
Дата 4.10.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



MyClass - указатель на объект

Это сообщение отредактировал(а) Alca - 4.10.2007, 12:10


--------------------
PM WWW ICQ Skype Jabber   Вверх
zkv
Дата 4.10.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



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

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

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

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


PM MAIL   Вверх
Alca
Дата 4.10.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

#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;
}


Это сообщение отредактировал(а) Alca - 4.10.2007, 13:02


--------------------
PM WWW ICQ Skype Jabber   Вверх
zkv
Дата 4.10.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



передать парамтры из потока можно примерно так:
Код

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 

Это сообщение отредактировал(а) zkv - 4.10.2007, 13:11
PM MAIL   Вверх
Alca
Дата 4.10.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Всё равно в asResult пусто:
Код

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


Это сообщение отредактировал(а) Alca - 4.10.2007, 13:39


--------------------
PM WWW ICQ Skype Jabber   Вверх
zkv
Дата 4.10.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



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

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

PM MAIL   Вверх
Alca
Дата 4.10.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Сорри отредактировал...
Код

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

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

Это сообщение отредактировал(а) Alca - 4.10.2007, 13:44


--------------------
PM WWW ICQ Skype Jabber   Вверх
zkv
Дата 4.10.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



возможно строка затирается на следующих итерациях цикла, возможно на момент вызова метода поток еще не отработал (WaitForSingleObject - делаем?), еще чего-нить... Смотри, ищи...
PM MAIL   Вверх
Alca
Дата 4.10.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



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


Это сообщение отредактировал(а) Alca - 4.10.2007, 13:57


--------------------
PM WWW ICQ Skype Jabber   Вверх
zkv
Дата 4.10.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 92



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

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

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

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

 smile 

Это сообщение отредактировал(а) zkv - 4.10.2007, 14:02
PM MAIL   Вверх
Alca
  Дата 4.10.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Обошлось без WaitForSingleObject:
Так не пашет:
Код

ShowMessage(asResult);

помогло

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

ShowMessage(asResult.c_str());


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

Это сообщение отредактировал(а) Alca - 4.10.2007, 17:07


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.