Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Igor-84
14 / 14 / 4
Регистрация: 04.03.2010
Сообщений: 94
#1

Реализация события без использования VCL - C++

24.08.2014, 10:37. Просмотров 357. Ответов 8
Метки нет (Все метки)

Здравствуйте! В C++ Builder, используя средства VCL, я реализовывал события так:
- в h-файле перед объявлением класса пишем:
C++
1
typedef void __fastcall (__closure *TProgrEvent)(int);
- в объявлении класса в разделе public пишем:
C++
1
__property TProgrEvent OnProgr = {read=FOnProgr, write=FOnProgr};
- в объявлении класса в разделе private пишем:
C++
1
TProgrEvent FOnProgr;
- в основном модуле при создании экземпляра класса пишем:
C++
1
2
MyClass *my_class = new MyClass();
my_class->OnProgr = onProgress;
где:
C++
1
2
3
4
void __fastcall Main::onProgress(int cnt)
{
ShowMessage(cnt);
}
- а непосредственно событие генерируется так:
C++
1
if (FOnProgr){FOnProgr(total_cnt);}
В общем-то, ничего сложного и всё понятно - это работает.
Вопрос: как всё это реализовать без использования VCL на С++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandr_1982
176 / 72 / 17
Регистрация: 04.11.2013
Сообщений: 382
Записей в блоге: 4
24.08.2014, 12:17     Реализация события без использования VCL #2
Вам нужно самому написать обработчик сообщений клиент и сервер. Передача сообщений может осуществляться с использованием сокетов. Приложение многопоточное. Класс "сообщение". Сервер управляет очередью сообщений и раздает сообщения клиентам. Сообщение помещается в очередь, проект может быть высоко нагруженным в случае большого количества сообщений. Очередь сообщений можно реализовать как двусвязный список.
Igor-84
14 / 14 / 4
Регистрация: 04.03.2010
Сообщений: 94
24.08.2014, 12:31  [ТС]     Реализация события без использования VCL #3
Alexandr_1982, мне нужно не сообщения обрабатывать, а события. Поэтому здесь нужно что-то другое.
Alexandr_1982
176 / 72 / 17
Регистрация: 04.11.2013
Сообщений: 382
Записей в блоге: 4
24.08.2014, 12:43     Реализация события без использования VCL #4
Событие это и есть сообщение. Если случилось событие, то генерируется сообщение, что случилось событие и помещается в очередь сообщений о событии. Очередь может быть приоритетной и не приоритетной. Постановка сообщений о событиях может быть по приоритетам.
Avazart
7066 / 5243 / 263
Регистрация: 10.12.2010
Сообщений: 23,070
Записей в блоге: 17
24.08.2014, 13:38     Реализация события без использования VCL #5
Цитата Сообщение от Igor-84 Посмотреть сообщение
Вопрос: как всё это реализовать без использования VCL на С++?
В С++ нет не свойств не событий, это примочки, так что если реализовывать подобное будет выглядеть через методы и колбеки.

Запрещение переинициализации public-поля как члена класса
Igor-84
14 / 14 / 4
Регистрация: 04.03.2010
Сообщений: 94
24.08.2014, 14:47  [ТС]     Реализация события без использования VCL #6
Alexandr_1982, Avazart, покажите, пожалуйста, пример реализации моей задачи.
Avazart
7066 / 5243 / 263
Регистрация: 10.12.2010
Сообщений: 23,070
Записей в блоге: 17
24.08.2014, 15:40     Реализация события без использования VCL #7
Я привел ссылку на пример.

Добавлено через 37 минут
Цитата Сообщение от Igor-84 Посмотреть сообщение
пример реализации моей задачи.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class MyClass
{
     public:
         MyClass():progress_function_(NULL),value_(0)
         {
 
         }
 
                 // Тип указателя на метод обработчик
         typedef void (MyClass::*Progress_function) (int& value);
 
                 // мето вызываюший "прогресс"
         void progress()
         {
             if(progress_function_)
                 (this->*progress_function_)(value_);
         }
 
                // Назначение обработчика
         void setOnProgress(Progress_function  progress_function)
         {
             progress_function_= progress_function;
         }
 
                 // два обработчика
         void myClassProgressNext(int& value);
         void myClassProgressBack(int& value);
 
     private:
         Progress_function  progress_function_; // Указатель на метод обработчик
         int value_;
};
 
// Обработчики
void MyClass::myClassProgressNext(int& value)
{
    value++;
    std::cout<< value << std::endl;
}
 
void MyClass::myClassProgressBack(int& value)
{
    value--;
    std::cout<< value << std::endl;
}
 
int main()
{
         MyClass obj;
 
         std::cout<<"Next"<< std::endl;
         obj.setOnProgress(MyClass::myClassProgressNext);
         obj.progress();
         obj.progress();
         obj.progress();
 
         std::cout<<"Back"<< std::endl;
         obj.setOnProgress(MyClass::myClassProgressBack);
 
         obj.progress();
         obj.progress();
 
        getchar();
        return 0;
}
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.08.2014, 18:04     Реализация события без использования VCL #8
Цитата Сообщение от Igor-84 Посмотреть сообщение
покажите, пожалуйста, пример реализации моей задачи.
https://ru.wikipedia.org/wiki/%D0%9D...D1%8F)#C.2B.2B
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 19:47     Реализация события без использования VCL
Еще ссылки по теме:

События у унаследованного VCL класса C++ Builder
C++ Наследование без использования двоеточия
C++ Конвертировать из BMP в PNG без VCL
C++ Шейкерная сортировка без использования while цикла
C++ Реализация вычисления факториала без использования функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
7066 / 5243 / 263
Регистрация: 10.12.2010
Сообщений: 23,070
Записей в блоге: 17
24.08.2014, 19:47     Реализация события без использования VCL #9
Цитата Сообщение от Igor-84 Посмотреть сообщение
Alexandr_1982, мне нужно не сообщения обрабатывать, а события. Поэтому здесь нужно что-то другое.
Все зависит от конкретной задачи, ибо приведенные решения в полной мере не могут заменить VCL- ную примочку __closure, по крайней мере я не знаю как это реализовать в полной мере.

Т.е. через указатель на метод/ф-цию или через визитер или через функциональный объект можно реализовать настраиваемое поведения, но к примеру я не знаю как реализовать следующее:
Если мы кидаем на форму кнопку и кликаем на ней, дизайнер автоматически создает метод формы и привязывает его к событию кнопки, т.е. связывается метод одного класса с событием другого класса, собствено в этом проблема.
Yandex
Объявления
24.08.2014, 19:47     Реализация события без использования VCL
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru