#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. Существует. Однако вы можете использовать его только для полей, а не для локальных переменных.