Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экзотический способ связывания ООП с потоками, любителям поизвращаться :) 
:(
    Опции темы
En_t_end
Дата 13.8.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Когда я только начинал кодить,меня интересовал вопрос, как же всё таки обмануть(наиболее выгодным способом) систему, подсунув функции создания потока такую функцию, которая могла бы иметь неограниченный доступ к полям некоторого класса. Совсем недавно, я вспомнил о этой вещи и решил показать smile
Код

#include <iostream>
#include "usync.h"

using namespace usync;
using namespace threads;

class TestClass
{
public:
    TestClass(){strcpy(HELLO,"Hello");ohoho=10230;};
public:
    inline void Start()
    {
        _hndle_ Handle;
        CreateThrd(Handle,Thread,(void*)this);
    };
protected:
    friend inline void *Thread(void *Param){std::cout << ((TestClass*)Param)->HELLO << " ohoho=" << ((TestClass*)Param)->ohoho << std::endl;return NULL;}
    char HELLO[100];
    int ohoho;
};

int main()
{
    TestClass test;
    test.Start();
    SLEEP(2);
    return 0;
}
 
CreateThrd(Handle,Thread,(void*)this); здесь CreateThrd - функция из моей либы, но вместо неё можно использовать и CreateThread и pthread_create, результат тот же.Можно ввести TestClass *testcls = (TestClass*)Param;
Может я не первый, кому до такого извращения удалось додуматься, ищу единомышленников-извращенцев smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
bel_nikita
Дата 13.8.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Я, наверное, не совсем понял извращения smile 
Вот, такой классический пример:
Код

  class Thread
  {
  public:
    Thread ( DWORD (WINAPI * pFun) (void* arg), void* pArg)
    {
      _handle = CreateThread (0, // Security attributes
                              0, // Stack size
                              pFun,
                              pArg,
                              CREATE_SUSPENDED,
                              &_tid);
    }

    ~Thread () { CloseHandle (_handle); }
    void SetPriority(int nPriority){SetThreadPriority(_handle,nPriority);}
    void Resume () { ResumeThread (_handle); }
    void Suspend() { SuspendThread(_handle); } 
    void WaitForDeath ()
    {
      WaitForSingleObject (_handle, 2000);
    }
    HANDLE GetHandle() { return _handle; }
  private:
    HANDLE _handle;
    DWORD  _tid;     // thread id
  };
  
  class cActiveObject
  {
  public:
    cActiveObject ();
    virtual ~cActiveObject () {}
    void Kill ();
    void SetPriority(int nPriority){_thread.SetPriority(nPriority);}
  protected:
    virtual void InitThread () = 0;
    virtual void Loop () = 0;
    virtual void FlushThread () = 0;

    static DWORD WINAPI ThreadEntry (void *pArg);

    int             _isDying;
    Thread          _thread;
  };

  inline cActiveObject::cActiveObject ():_isDying (0), 
#pragma warning(disable: 4355) // 'this' used before initialized
    _thread (ThreadEntry, this)
#pragma warning(default: 4355)
  {
  }
  
  inline void cActiveObject::Kill ()
  {
    _isDying++;
    FlushThread ();
    // Let's make sure it's gone
    _thread.WaitForDeath ();
  }
  
  inline DWORD WINAPI cActiveObject::ThreadEntry (void* pArg)
  {
    cActiveObject * pActive = (cActiveObject *) pArg;
    pActive->InitThread ();
    pActive->Loop ();
    return 0;
  }



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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