Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread, как работать в Visual C++ 
:(
    Опции темы
Aline
Дата 12.2.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет всем!

Мне надо работать с потоками и с прерываниями, а опыта маловато.
Подкинули исходник, сделанный в Борланде, надо переделать на Visual C++, но постоянно натыкаюсь на какие то ошибки.

К примеру:

В Борланде h-файл имеет вид:

Код

#ifndef UTIRQEventH
#define UTIRQEventH
#include <Classes.hpp>

typedef void __fastcall (__closure *TCBFunc)(void*);

class TThreadEvent : public TThread
{
public:
    __fastcall TThreadEvent(bool Suspended);
    __fastcall ~TThreadEvent(void);
    void  __fastcall ESynhro(void);
    bool __fastcall SetEvent(const char* EventName);
    bool __fastcall SetCBFunction(TCBFunc SCBFunc, void *SContext);
private:
    void __fastcall Execute (void);
    HANDLE    hEvent;
    TCBFunc            CBFunc;
    void            *ContextCBFunc;
};

class TIRQEvent
{
private:
    TThreadEvent    *ThreadEvent;
    bool            EventIsSet;
    bool            CBFuncIsSet;
public:
    __fastcall TIRQEvent(void);
    __fastcall ~TIRQEvent(void);
    bool __fastcall ConnectToEvent(const char* EventName);
    bool __fastcall SetCBFunction(TCBFunc SCBFunc, void *SContext);
    bool __fastcall Start(void);
    bool __fastcall Stop(void);
};


я пытаюсь переделать в Visual C++ 

Код

#include <Windows.h>
#include <stdio.h>

using namespace System;
using namespace System::Threading;

typedef void TCBFunc(void*);

ref class TThreadEvent : System::Threading::Thread
{
    public:
            TThreadEvent(bool Suspended);
            ~TThreadEvent(void);
            void ESynhro(void);
            static bool SetEvent(const char* EventName);
            bool SetCBFunction(TCBFunc SCBFunc, void *SContext);
            
        private:
            void Execute (void);
            HANDLE    hEvent;
            TCBFunc            CBFunc;
            void            *ContextCBFunc;
};

public ref class TIRQEvent
    {
        private:
            TThreadEvent^    ThreadEvent;
            bool            EventIsSet;
            bool            CBFuncIsSet;
        public:
            TIRQEvent(void);
            ~TIRQEvent(void);
            bool ConnectToEvent(const char* EventName);
            bool SetCBFunction(TCBFunc SCBFunc, void *SContext);
            bool Start(void);
            bool Stop(void);
    };



но сразу же в строке:

Код

ref class TThreadEvent : System::Threading::Thread


возникает ошибка, а как же тогда определить, что класс наследуется от Thread?
PM MAIL   Вверх
tol05
Дата 12.2.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



от class Thread нельзя наследоваться
Цитата

public sealed class Thread : CriticalFinalizerObject, _Thread


совет - использую не наследование, а агрегацию (внутри TThreadEvent сделай поле-член класса Thread и организуй средства доступа и работы с этим Thread)
еще неплохо было бы описать задачу... Что делает этот код, почему у лкссаов именно столько и именно таких членов?


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Aline
Дата 15.2.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В отдельном потоке должна запускаться процедура, которая будет отслеживать прерывание. Т.е. есть плата, для неё разработан драйвер,  и по окончания какого-то процесса выставляется прерывание. Суть в том, что надо вовремя поймать это прерывание (или событие)

Вот текст *.cpp на Борланде:

Код

//---------------------------------------------------------------------------


#pragma hdrstop

#include "UTIRQEvent.h"

//---------------------------------------------------------------------------
__fastcall TIRQEvent::TIRQEvent(void)
{
     ThreadEvent = new TThreadEvent(true);
     EventIsSet = false;
     CBFuncIsSet = false;
}
//---------------------------------------------------------------------------

__fastcall TIRQEvent::~TIRQEvent(void)
{
     ThreadEvent->Resume();
     ThreadEvent->Terminate();
     ThreadEvent->WaitFor();
}
//---------------------------------------------------------------------------

bool __fastcall TIRQEvent::ConnectToEvent(const char* EventName)
{
    EventIsSet = ThreadEvent->SetEvent(EventName);
    return EventIsSet;
}
//---------------------------------------------------------------------------

bool __fastcall TIRQEvent::SetCBFunction(TCBFunc SCBFunc, void *SContext)
{
    CBFuncIsSet = ThreadEvent->SetCBFunction(SCBFunc, SContext);
    return CBFuncIsSet;
}
//---------------------------------------------------------------------------

bool __fastcall TIRQEvent::Start(void)
{
    bool status = true;
    if (EventIsSet & CBFuncIsSet) {
        ThreadEvent->Resume();
    } else {
        status = false;
    }
    return status;
}
//---------------------------------------------------------------------------

bool __fastcall TIRQEvent::Stop(void)
{
    bool status = true;
    if (ThreadEvent->Suspended) {
       status = false;
    }
    ThreadEvent->Suspend();
    return status;
}
//---------------------------------------------------------------------------


//===========================================================================
//===========================================================================
//===========================================================================

void  __fastcall TThreadEvent::ESynhro(void)
{
    CBFunc(ContextCBFunc);
}
//---------------------------------------------------------------------------

void  __fastcall TThreadEvent::Execute(void)
{
     while (!Terminated) {
        if (WaitForSingleObject(hEvent, 500) != WAIT_TIMEOUT) {
            Synchronize((TThreadMethod)&ESynhro);
        }
     }
}
//---------------------------------------------------------------------------

__fastcall TThreadEvent::TThreadEvent(bool Suspended)
    : TThread(Suspended)
{
    hEvent = NULL;
}
//---------------------------------------------------------------------------

__fastcall TThreadEvent::~TThreadEvent(void)
{
    CloseHandle(hEvent);
}
//---------------------------------------------------------------------------


bool __fastcall TThreadEvent::SetEvent(const char* EventName)
{
    bool status = true;
    hEvent = OpenEvent(SYNCHRONIZE, false, EventName);
    if (hEvent == NULL) {
       status = false;
    }
    return status;
}
//---------------------------------------------------------------------------

bool __fastcall TThreadEvent::SetCBFunction(TCBFunc SCBFunc, void *SContext)
{
    bool  status = true;
    if (SCBFunc != NULL) {
        CBFunc = SCBFunc;
        ContextCBFunc = SContext;
    } else {
        status = false;
    }
    return status;
}
//---------------------------------------------------------------------------

#pragma package(smart_init)



пока никак не получается понять как это реализовать в Visual'e....
PM MAIL   Вверх
tol05
Дата 15.2.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 63
Всего: 170



ты можешь создать потоки, запустить их и выполнять в них какие-то задачи. При этом создаешь события в классах, подписываешься на них, (при необходимости их генеришь)
Код

class A
    {
        public EventHandler WorkNextStep;
        public void Work()
        {
            //имитируем длительные операции, при выполнении которых мы можем получать сообщения от других классов
            Random r = new Random();
            while(true)
            {
                Thread.Sleep(r.Next(5) * 1000);
                
                if(WorkNextStep != null)
                {
                    WorkNextStep(this, new EventArgs());
                }
            }
        }
        
        public void ReceiveMessageFromB(object sender, EventArgs arg)
        {
            //если ввести переменную bool needWork=true, в Work вместо while(true) написать while(needWork)
            //то здесь можно написать needWork=false - т.е. при приходе сообщения из другого потока(другого
            //класса) мы прерываем нашу работу... Одним словом, вариантов много
            Console.WriteLine("I'm class A and I have received the message from class B");
        }
    }

    class B
    {
        public EventHandler RunNextStep;
        public void Run()
        {
            //имитируем длительные операции, при выполнении которых мы можем получать сообщения от других классов
            Random r = new Random();
            while(true)
            {
                Thread.Sleep(r.Next(5)*1000);
                
                if(RunNextStep != null)
                {
                    RunNextStep(this, new EventArgs());
                }
            }
        }

        public void ReceiveMessageFromA(object sender, EventArgs arg)
        {
            Console.WriteLine("I'm class  B and I have received the message from class A");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();

            //класс B подписывается на события класса A            
            a.WorkNextStep += b.ReceiveMessageFromA;
            //класс А подписывается на события класса B
            b.RunNextStep += a.ReceiveMessageFromB;
            
            //оба класса будут работать в отдельных потоках
            Thread t1 = new Thread(a.Work);
            Thread t2 = new Thread(b.Run);
            
            t1.Start();
            t2.Start();
        }
    }

если этот пример понятен, то и свою задачу ты сделаешь без труда smile
Запускаешь монитор прерываний в отдельном потоке, когда он получит сообщение, он сгененрирует свое событие (а на это событие ты подписываешься в своем основном потоке)

Это сообщение отредактировал(а) tol05 - 15.2.2008, 13:55


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Aline
Дата 15.2.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05, как всё сложно... Попробую разобраться.
Дело ещё в том C# всё-таки отличается от C++, и не все примеры для C# я могу с легкостью реализовать в С++, знаний не хватает...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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