Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
RefSol
486 / 232 / 71
Регистрация: 31.10.2010
Сообщений: 688
#1

SetTimer и E2235 Member function must be called or its address taken - C++ Builder

16.03.2014, 16:39. Просмотров 975. Ответов 8
Метки нет (Все метки)

Всем Привет!
Прошу помочь разобраться в чём ошибка,
собственно текст программы из Архангельского "механизмы windows, сети".
Благодарю.

p.s.: C++Builder XE

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
VOID CALLBACK Timer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
  //
  if( idEvent = 1) {
    KillTimer(hwnd, idEvent);
  }
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 
    SetTimer(Handle, // дескриптор потока таймера
              1,           // идентификатор таймера, любое целое число
              2000,      // время
              (FARPROC)Timer); // вызываемая функция, собственно на эту строку ссылается сообщение  
                                       // E2235 Member function must be called or its address taken
 
}

http://www.cyberforum.ru/cpp-builder/thread693690.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 16:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос SetTimer и E2235 Member function must be called or its address taken (C++ Builder):

[C++ Error] Unit1.cpp(23): E2235 Member function must be called or its address taken
Хочу открыть файл из компонента sShelllistView1 в компонент WebBrowser. ...

cspin.h inline member function in package class
Как с эти бороться,куча warning сообщений появляется?Дело в классе самом?

[xvalue][msvs/gcc][bug] member function with ref-qualifier
добрый вечер. следующий код работает как и ожидается. и прекрасно...

ошибка [BCC32 Error] windowp.cpp(201): E2235 Member function must be called or its address taken
wc.lpfnWndProc = WndProc; windowp.cpp(201): E2235 Member function must be...

C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend
выкидывает C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member...

8
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
16.03.2014, 18:31 #2
Во-первых, не (FARPROC), а (TIMERPROC), а во-вторых - зачем в Билдере использовать API-шный таймер?
1
RefSol
486 / 232 / 71
Регистрация: 31.10.2010
Сообщений: 688
16.03.2014, 19:14  [ТС] #3
Цитата Сообщение от UI Посмотреть сообщение
Во-первых, не (FARPROC), а (TIMERPROC), а во-вторых - зачем в Билдере использовать API-шный таймер?
Эти типы совместимы,
пробовал и TIMERPROC, результаты те же.
API должны работать т.к. winAPI есть основа ОС.
Собственно я не говорю об обязательности использования именно winAPI,
самое главное в данном вопросе как передать в виде параметра ссылку на функцию (метод) член класса.
Желательно на данном примере SetTimer(...)
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
16.03.2014, 19:17 #4
Лучший ответ Сообщение было отмечено RefSol как решение

Решение

Цитата Сообщение от RefSol Посмотреть сообщение
пробовал и TIMERPROC, результаты те же.
И я пробовал (заодно поправил неправильный оператор сравнения):
SetTimer и E2235 Member function must be called or its address taken
Что я делаю не так?

Цитата Сообщение от RefSol Посмотреть сообщение
Эти типы совместимы,
Ну-ну...
Это:
C++
1
typedef VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
и вот это:
C++
1
typedef int (FAR WINAPI *FARPROC)();
- совместимы ?
1
RefSol
486 / 232 / 71
Регистрация: 31.10.2010
Сообщений: 688
16.03.2014, 19:55  [ТС] #5
Благодарю за подробные разъяснения и исправления,
типы действительно значительно отличаются.
Странно почему в msdn порядок параметров SetTimer(...) отличается от C++Builder,
UINT_PTR - второй параметр
хотя типы UINT_PTR и UINT точно совместимы unsigned int
C++
1
2
3
4
5
UINT_PTR WINAPI SetTimer(
_In_opt_  HWND hWnd,   
_In_      UINT_PTR nIDEvent,   
_In_      UINT uElapse,   
_In_opt_  TIMERPROC lpTimerFunc );
как в msdn указаны: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Пробовал запустить в соответствии с указанными исправлениями, но результат не радует,
возможно необходима настройка каких то опций в компиляторе по длине указателей (у меня Windows 32 разряда C++BuilderXE 32) или в чём то другом ошибка, благодарю.
SetTimer и E2235 Member function must be called or its address taken
0
RefSol
486 / 232 / 71
Регистрация: 31.10.2010
Сообщений: 688
16.03.2014, 22:05  [ТС] #6
Благодарю за подробные разъяснения и исправления,
типы FARPROC, а TIMERPROC действительно значительно отличаются.

Добавлено через 1 час 53 минуты
UI, пока ждал ответа разобрался, функция:
C++
1
2
3
4
5
VOID CALLBACK Timer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
  if( idEvent == 1) {
    KillTimer(hwnd, idEvent);
  }
}
должна быть объявлена глобальной (вне класса), в этом случае компилируется успешно.

Но вопрос как в SetTimer передать в качестве параметра указатель на функцию-метод класса.
Если возможно покажите пожалуйста пример.
Благодарю.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
16.03.2014, 22:43 #7
Цитата Сообщение от RefSol Посмотреть сообщение
как в SetTimer передать в качестве параметра указатель на функцию-метод класса
Аналогично: http://www.cyberforum.ru/win-api/thread921639.html#post4832375
1
RefSol
486 / 232 / 71
Регистрация: 31.10.2010
Сообщений: 688
16.03.2014, 23:12  [ТС] #8
UI, как насчёт подобного кода, есть указатель в параметрах функции CreateThread на метод класса runProcess
взято от сюда (http://www.codeproject.com/Articles/...2-threads-in-C)

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#pragma hdrstop
 
#include <tchar.h>
#include <iostream>
//project dependencies
#include "cthread.h"
//end project dependencies
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
  CThread* th = new CThread();
  th->CreateThread();
 
  char buf[256];
  std::cout<<"runProcess in main"<<std::endl;
  std::cin>>buf;
  std::cout<<buf<<std::endl;
  system("pause");
 
 
  return 0;
}
//---------------------------------------------------------------------------
/*
*/
 
 
 
//*********************************************************
//default constructor for class CThread
//*********************************************************
CThread::CThread ()
{
    this->hThread       = NULL;
    this->hThreadId     = 0;
    this->hMainThread   = ::GetCurrentThread ();
    this->hMainThreadId = ::GetCurrentThreadId ();
    this->Timeout       = 2000; //milliseconds
}
 
//*********************************************************
//destructor for class CObject
//*********************************************************
CThread::~CThread ()
{
    //waiting for the thread to terminate
    if (this->hThread) {
        if (::WaitForSingleObject (this->hThread, this->Timeout) == WAIT_TIMEOUT)
            ::TerminateThread (this->hThread, 1);
 
        ::CloseHandle (this->hThread);
    }
}
 
//*********************************************************
//working method
//*********************************************************
unsigned long CThread::Process (void* parameter)
{
 
    //a mechanism for terminating thread should be implemented
    //not allowing the method to be run from the main thread
    if (::GetCurrentThreadId () == this->hMainThreadId)
        return 0;
    else {
 
        return 0;
    }
 
}
 
//*********************************************************
//creates the thread
//*********************************************************
bool CThread::CreateThread ()
{
 
    if (!this->IsCreated ()) {
        param*  this_param = new param;
        this_param->pThread = this;
        this->hThread = ::CreateThread (NULL, 0, (unsigned long (__stdcall *)(void *))this->runProcess, (void *)(this_param), 0, &this->hThreadId);
        return this->hThread ? true : false;
    }
    return false;
 
}
 
//*********************************************************
//creates the thread
//*********************************************************
int CThread::runProcess (void* Param)
{
    CThread*    thread;
    thread          = (CThread*)((param*)Param)->pThread;
 
  std::cout<<"runProcess in Thread"<<std::endl;
  //system("pause");
    delete  ((param*)Param);
    return thread->Process (0);
}
Добавлено через 5 минут
UI, решения надо искать при использовании ключевого слова __closure, но каков синтаксис?
как в справке не работает.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25613 / 17166 / 6826
Регистрация: 22.10.2011
Сообщений: 30,361
Записей в блоге: 6
17.03.2014, 01:03 #9
Цитата Сообщение от RefSol Посмотреть сообщение
как насчёт подобного кода
А ты внимательнее посмотри на код по своей ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//here we create the thread
HANDLE CThread::CreateThread ()
{
    return ::CreateThread ((NULL, 0, (unsigned long (__stdcall *)(void *))this->runProcess, 
                (void *)this, 0, NULL);
}   
 
//static method
int CThread::runProcess (void* pThis)
{
    return ((CThread*)(pThis))->Process();
}
В 8-ой строке все написано. То же самое я предлагал и по ссылке выше. Так что... Выбирай, либо static-метод, либо глобальная функция, а не метод класса.
1
17.03.2014, 01:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 01:03
Привет! Вот еще темы с решениями:

Ошибка - Function to be called, DateOf, was eliminated by linker
Доброе время суток, Пользуюсь Delphi 10.2 уже месяцев 5, но до этого не...

Ошибка Call to a member function
Fatal error: Call to a member function stripNonText() on a non-object in...

Ошибка: cannot call member function
Доброе время суток ребят такая фигня, решил значит наконец то классы освоить но...

Call to a member function fetch_object()
&lt;?php $db = new mysqli('localhost','root' ,'' ,'blog'); $query =...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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