Как я могу отслеживать выполнение функции в C и C#

#c# #c #multithreading

#c# #c #многопоточность

Вопрос:

У меня есть функция, написанная на C и скомпилированная в DLL. Затем DLL импортируется в программу на C # и вызывается функция.

Функция C обрабатывает файлы, что может занять некоторое время, поэтому я искал способ отслеживать выполнение функции.

Я думал, что мог бы передать указатель на значение с плавающей точкой в функцию, запустить функцию в потоке из C #, а затем распечатать значение с плавающей точкой:

Функция C :

 void process(float *status)
{
    //process file code
    //............//

    *status = processed / total * 100;
}
 

А затем в коде C #:

 static extern void process(float *status);

int Main()
{
    float status = 0;
    
    thread.start(process(amp;status));

    while(status != 100)
    {
        Console.Write(status);
    }
}
 

Единственная проблема с этим заключается в том, что я не могу передать указатель на поток в качестве аргумента.

Как я могу этого добиться??

Комментарии:

1. Вам нужна собственная библиотека DLL c . Или вы можете преобразовать проект в целевой c / clr?

2. Вам понадобятся некоторые атомарные типы или другой механизм синхронизации, чтобы избежать гонки данных.

3. Это собственная библиотека DLL c

Ответ №1:

Если у вас есть код на C , вы можете заменить status переменную обратным вызовом.

Если нет, вы можете просто сделать локальную переменную для status глобальной, если вам это нравится:

 volatile float status;

void ThreadWorker() 
{
    process(ref status);        
}

int Main() 
{
   Thread t = new Thread(ThreadWorker);
   t.Start();

   while(status != 100)
   {
      Console.Write(status);
   }
}
 

Комментарии:

1. как я могу сделать это в c #?

2. Вышесказанное на C #. 🙂

3. О, хорошо, я говорил это, потому что в c нет ключевого слова volatile#

4. Существует. Однако вы можете использовать его только для полей, а не для локальных переменных.