powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / классы и потоки
9 сообщений из 9, страница 1 из 1
классы и потоки
    #34462737
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Интересно ваше мнение по следующему вопросу: стоит ли потоковые функции делать экзмеплярами классов и при вызове передать им указать this для доступа к данных классам либо писать отдельную потоковую функцию, которая работает с классом (данные в классе допустим могли бы быть защищены критическими секциями)? Я обычно делаю потоковую функцию статическим методом класса:
class Archiver
{
static DWORD CalculateDataThread(LPVOD param);
static DWORD WriteToDbThread(LPVOID param);
};

Некоторые используют ключевое слово __stdcall. Чем лучше объявление функции с этим ключевым словом?

static UINT __stdcall AcceptThread(LPVOID);
...
Рейтинг: 0 / 0
классы и потоки
    #34462771
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я разницы не вижу? хотя для компилятора она есть и некоторые даж варнингами кидаютсяю Строго говоря они правы, поскольку функция должна быть с С связыванием (extern C)
...
Рейтинг: 0 / 0
классы и потоки
    #34463632
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Интересно ваше мнение по следующему вопросу: стоит ли потоковые функции делать экзмеплярами классов и при вызове передать им указать this для доступа к данных классамесли это по идее функция-член, то стоит.
...
Рейтинг: 0 / 0
классы и потоки
    #34463713
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
class Archiver
{
public:
bool Start();
bool Stop();
private:
static DWORD CalculateDataThread(LPVOD param);
static DWORD WriteToDbThread(LPVOID param);
//Далее некие данные
//массив входных данных
//рассчитанные данные
//очередь, из которой данные из памяти пишутся в БД
};
По вашему мнению такая реализация является правильной и стоит ли для потоковых функций использовать __stdcall? Может быть потоковый функции вынести за пределы класса. Хотелось бы узнать кто как делает в подобных случаях.
...
Рейтинг: 0 / 0
классы и потоки
    #34463861
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005 пишет:

> Интересно ваше мнение по следующему вопросу: стоит ли потоковые функции
> делать экзмеплярами классов и при вызове передать им указать this для
> доступа к данных классам либо писать отдельную потоковую функцию,
> которая работает с классом (данные в классе допустим могли бы быть
> защищены критическими секциями)? Я обычно делаю потоковую функцию
> статическим методом класса:
> class Archiver
> {
> static DWORD CalculateDataThread(LPVOD param);
> static DWORD WriteToDbThread(LPVOID param);
> };
>
> Некоторые используют ключевое слово __stdcall.

Это абсолютно все равно. Если вам удобнее иметь ее мембером,
то и хорошо. Главное, чтобы функция не была бы нестатическим мембером.

Чем лучше объявление
> функции с этим ключевым словом?

Ничем.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
классы и потоки
    #34463906
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я не понял, потоковая функция – это та, которая передаётся в CreateThread?
...
Рейтинг: 0 / 0
классы и потоки
    #34463951
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать класс потока, который будет иметь свою статическую функцию. Ему будет передоваться указатель на класс и на его функцию. Класс потока будет создавать поток запуская свою статическую функцию, с параметром - указатель на свой класс. Далее, в функции, параметр приводится к указателю, берется укзатель на требуемый класс и вызывается его функция:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template<class Class1>
class Thread{
   private:
       typedef (Class1::*Func)();

        Class1 *class1;
        Func func;
  
   public:
       Thread(Class1 *_class1, Func _func) :
        class1(_class1),
         func(_func),
...

     static void*thread_proc(void*_p) {
         Thread *thread=(Thread*)_p;
         (*thread->class1).func();
      }
};

...
Рейтинг: 0 / 0
классы и потоки
    #34464025
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoчто-то я не понял, потоковая функция – это та, которая передаётся в CreateThread?

Да под потоковой функцией, я понимаю функцию, которая передаётся в CreateThred?
...
Рейтинг: 0 / 0
классы и потоки
    #34464152
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhМожно сделать класс потока, который будет иметь свою статическую функцию. Ему будет передоваться указатель на класс и на его функцию. Класс потока будет создавать поток запуская свою статическую функцию, с параметром - указатель на свой класс. Далее, в функции, параметр приводится к указателю, берется укзатель на требуемый класс и вызывается его функция:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template<class Class1>
class Thread{
   private:
       typedef (Class1::*Func)();

        Class1 *class1;
        Func func;
  
   public:
       Thread(Class1 *_class1, Func _func) :
        class1(_class1),
         func(_func),
...

     static void*thread_proc(void*_p) {
         Thread *thread=(Thread*)_p;
         (*thread->class1).func();
      }
};



Спасибо за идею. Да, интересная мысль мне это в голову не приходило.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / классы и потоки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]