【问题标题】:Cancelling BackgroundWorker in C++/CLI wrapper of native C++ loop在本机 C++ 循环的 C++/CLI 包装器中取消 BackgroundWorker
【发布时间】:2013-04-02 10:10:40
【问题描述】:

post 这样,我需要在派生自 .NET BackgroundWorker 的 C++/CLI 类中取消 BackgroundWorker。

我正在使用 C++/CLI 来包装一个长期运行的旧式原生 C++ 函数。

我如何/应该如何从本机 C++ 中的长时间运行循环访问 BackgoundWorker 类的 CancellationPending 成员?

public ref class BackgroundWorkerWrapper : BackgroundWorker
{
    private:
        Outline* pOutline;

    public:
        BackgroundWorkerWrapper(void) 
        {
            WorkerReportsProgress = true;

            pOutline = new Outline;

    //      pOutline->CancellationPending = &(BackgroundWorker::CancellationPending);

        }

    protected:

        virtual void OnDoWork(DoWorkEventArgs ^e) override {
            pOutline->DoWork();
            BackgroundWorker::OnDoWork(e);
        }

    };

您可以在上面看到我已尝试将 CancellationPending 映射到 Outline 类中的布尔值。到目前为止,这还没有奏效。

我的大纲课程相当简单。

public class Outline
{

public:
    bool* CancellationPending;

    Outline()
    {
    }
    ~Outline()
    {
    }

    void DoWork()
    {
        try
        {
            for (int i=0; i < 1000; i++)
            {
                if (CancellationPending[0] == true)
                {
                    break;
                }

                // Do some trivial work
                Sleep(50);
            }
        }
        // catch(...)
              catch (exception& e)
        {
            cout << e.what() << endl;
        }

    }
};

是否有另一种方法可以将另一个处理程序添加到 BackgroundWorker 类的 CancelAsnc() 函数中,以某种方式在大纲类中设置取消变量?

谢谢。

【问题讨论】:

    标签: c++ .net c++-cli backgroundworker


    【解决方案1】:

    您可以在 OnDoWork 覆盖的末尾添加一些内容,以持续检查 BackgroundWorker::CancellationPending 标志。如果为真,也将pOutline-&gt;CancellationPending 设置为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多