gpt4 book ai didi

c# - 为什么 C 代码在 C# 中实现为 DLL 时速度较慢

转载 作者:行者123 更新时间:2023-11-30 16:26:23 26 4
gpt4 key购买 nike

我编写了一个 C 程序,它从二进制文件中读取一些值并将它们写入 SQLite DB 中。我在 DLL 库中转换了相同的文件,并从 C# 中的 Windows 窗体应用程序调用它。以下是说明我想要做什么的示例:

在 C# 中我使用以下内容

[DllImport("Progress.dll", EntryPoint = "CreateDB", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int avance(IntPtr Path);

DLL C 代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdint.h >
#include <math.h>
#define EXPORT __declspec(dllexport)
EXPORT void CreateDB(int f)
{
for (int i=0;i<4;i++)
{
sleep(1);
f=i+1;
}
}

变量f返回我想在进度条中使用的值。

Exe C 代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>
#include <math.h>
int main()
{
for (int i=0;i<4;i++)
{
sleep(1);
}
}

现在我将 C 程序作为 DLL 调用,它持续了 3 次来执行该作业。我预计时间与 C exe 文件非常相似。另外,进度条并不是实时更新的。

Windows 应用程序窗体中的 C# 代码如下:

private void button7_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 4;
IntPtr strPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
progressBar1.Value = avance(strPtr);
Application.DoEvents();
}

如何解决速度问题以及如何在 C DLL 运行循环时更新进度条?

预先感谢您的帮助。

最佳答案

您的 C# 代码调用 C 函数,就像它采用指向 int 的指针一样。但根据你的声明,它需要一个普通的 int 。如果您按如下方式更改它应该可以工作:

EXPORT void CreateDB(int *f)
{
for (int i = 0; i < 4; i++)
{
sleep(1);
*f = i + 1;
}
}

关于c# - 为什么 C 代码在 C# 中实现为 DLL 时速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53092813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com