C ++函数调用缺少参数列表

时间:2013-06-17 19:47:44

标签: c++

#include <iostream>
#include <Windows.h>
#include <process.h>
#include <time.h>
#include <conio.h>

using namespace std;
class Klasa
{
public:
    void petla(void* Args)
    {
        time_t tWait = clock() + 4 * CLOCKS_PER_SEC;
        for(;;)
        {
            cout << "Test dzialania watkow" << endl;
            Sleep(1000);
        }
        _endthread();
    }
};
void main()
{
    Klasa* pKlasa = new Klasa;
    time_t tCzas = clock() + 10 * CLOCKS_PER_SEC;
    _beginthread(pKlasa->petla, 0, NULL);
    while(tCzas>=clock())
    {
        cout << " Dziala" << endl;
        Sleep(500);
    }
    getch();
}

错误1错误C3867:'Klasa :: petla':函数调用缺少参数列表;使用'&amp; Klasa :: petla'创建指向成员的指针c:\ users \ bartek \ documents \ visual studio 2012 \ projects \wątki\wątki\ source.cpp 261Wątki

这是一个错误,我不知道我做了什么因为我无法将()放入此beginthread(pKlasa->petla, 0, NULL); 伙计们请帮帮我:C

4 个答案:

答案 0 :(得分:4)

如果您希望

Klasa::petla成为线程的入口点,则需要将其声明为静态。

在对象中启动线程而不泄漏对任何重要或线程危险的访问的典型习惯看起来像这样:

#include <iostream>
#include <Windows.h>
#include <process.h>
#include <time.h>

class Klasa
{
public:
    void Start();

private:
    static void ThreadEntry(void *p);
    void ThreadBody();
};

void Klasa::Start()
{
    _beginthread(Klasa::ThreadEntry, 0, this);
}

void Klasa::ThreadEntry(void *p)
{
    ((Klasa *) p)->ThreadBody();
    _endthread();
    return;
}

void Klasa::ThreadBody()
{
    // do threaded action here
    time_t tWait = clock() + 4 * CLOCKS_PER_SEC;
    for(;;)
    {
        cout << "Test dzialania watkow" << endl;
        Sleep(1000);
    }
}

void main()
{
    Klasa k;
    k.Start();

    time_t tCzas = clock() + 10 * CLOCKS_PER_SEC;
    while(tCzas>=clock())
    {
        cout << " Dziala" << endl;
        Sleep(500);
    }

    char c;
    c << std::cin; // stick to either cin/cout or C-style IO, not both
}

至少,我倾向于使用pthreads来做这件事。我想它与windows线程基本相同。

另外,请尽量避免使用Hungarian Notation。这是个人偏好,但是有很多好的论据没有使用它(比如C ++是强类型的,并且每个变量或函数的类型从其定义中都很明显)。

答案 1 :(得分:3)

来自documentation

uintptr_t _beginthread( 
   void( *start_address )( void * ),
   unsigned stack_size,
   void *arglist 
);

因此该函数将指针指向函数 指向成员指针。你无法在两者之间进行转换。

使用static成员函数(绑定到类而不是实例)或创建非成员函数。

答案 2 :(得分:2)

您必须传递函数地址。

你不能写

_beginthread(&(pKlasa->petla), 0, NULL);

因为_beginthread想要指向函数的指针,而不是指向对象方法的指针。 使用所需签名定义普通函数:

void threadfunc(void *data) {
  reinterpret_cast<Klasa*>(data)->petla();
}

然后用

开始一个新线程
_beginthread(threadfunc, 0, pKlasa); 

答案 3 :(得分:0)

std::thread(&Klasa::petla, pKlasa);

如果您没有C ++ 11库,则可以使用Boost执行相同的操作。