Почему код C при реализации как DLL медленнее в C # - PullRequest
0 голосов
/ 01 ноября 2018

Я написал программу на C, которая считывает некоторые значения из двоичных файлов и записывает их в БД SQLite. Я преобразовал тот же файл в библиотеку DLL и вызвал его из приложения Windows Form в C #. Ниже приведен пример, который иллюстрирует, что я хочу сделать:

В 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, выполнение этой задачи длится три раза. Я ожидаю, что время очень похоже на файл C exe. Кроме того, индикатор выполнения не обновляется в режиме реального времени.

Код C # в форме приложения для Windows выглядит следующим образом:

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?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 02 ноября 2018

Ваш код C # вызывает функцию C, как если бы он взял указатель на int. Но, согласно вашему заявлению, требуется простой int. Это должно работать, если вы измените его следующим образом:

EXPORT void CreateDB(int *f)
{
    for (int i = 0; i < 4; i++)
    {
        sleep(1);
        *f = i + 1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...