【问题标题】:C# progressbar update from c++ using managed c++ cli使用托管 c++ cli 从 c++ 更新 C# 进度条
【发布时间】:2016-05-18 19:26:33
【问题描述】:

我是 C# 和 C++ 混合编程的新手。

我的 C# 应用程序有一个 ProgressBar。单击按钮时,通过 c++/CLI 包装类 DLL 调用 c++ 函数。这是一个耗时的功能。因此,我想在我的 c# 应用程序的 ProgressBar 上显示状态更新。

UI 不应被阻塞,因此使用了 backgroundworker;在它的 DoWork 中,我调用了 DLL 方法。请用代码建议。

[我得到的一个线索是我需要使用委托,但我是 C++/CLI 的新手,因此无法使用。]

代码 sn-ps 会有很大帮助。

【问题讨论】:

    标签: c# dll c++-cli progress-bar backgroundworker


    【解决方案1】:

    您需要有一个更新进度条的托管方法(C# 或 C++/CLI),它以百分比作为参数。让托管方法处理任何必要的线程;您可能需要调用 UI 线程。

    将其转换为 C++ 函数指针,并将其传递给长时间运行的 C++ 函数。让长时间运行的 C++ 函数定期调用函数指针。

    您可以在这里使用BackgroundWorker,但我个人会跳过它。您必须做很多工作才能使一切正常运行,如果您只对报告进度感兴趣,那么直接这样做会更容易。相反,我会采用直接路径,只需在新的Thread 上调用您的 C++ 方法。

    【讨论】:

    • 感谢 David Yaw 的建议。是的,我确实有一个托管方法,它将采用一个参数来处理完成百分比。它还可以具有长期运行功能的参数。但是,如果可以共享一些小的 sn-p,我将不胜感激。
    • 尝试执行此操作,如果您有特定问题,请专门发布有关该问题的问题。对于此类问题,已经有大量通用帮助。
    【解决方案2】:

    这是一种无需事件的简单方法

    C++:
    
    int progressvalue;
    
    extern "C" __declspec(dllexport) void __cdecl LongRunningMethod(int seconds)
    {
        cout << "Started" << endl;
    
        progressvalue = 0;
        for (size_t i = 0; i < seconds; i++)
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(1000));
            progressvalue = (seconds - ((double)seconds/ (double)i))*10;
            cout << "Progress value in c++: " << progressvalue << endl;
        }
        cout << "Completed" << endl;
    }
    
    extern "C" __declspec(dllexport) int __cdecl GetProgressUpdate()
    {
        return progressvalue;
    }
    

    这里是如何在 c# 中使用它 时间:

    private void button_Click(object sender, RoutedEventArgs e)
    {
            var task = Task.Factory.tartNew(() => {
                                   NativeMethods.LongRunningMethod(10);});
    
        Task.Factory.StartNew(() =>
        {
            while (!task.IsCompleted)
            {
                Dispatcher.Invoke(() =>
                {
                    var val = NativeMethods.GetProgressUpdate();
                    ProgressBarMain.Value = val;
                    Thread.Sleep(100);
                });
            }
        });
    }
    

    【讨论】:

    • 谢谢。你能帮助 C#、包装器和 C++ 组合的托管 C++/cli 版本吗?我是新来的,所以这是一个请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多