Это старый поток, который встречается во многих моих поисках, но в Win7 появился новый планировщик, и, похоже, он ведет себя не так, как описано выше.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
DateTime dtEnd = DateTime.Now.AddSeconds(1.0);
int i = 0;
while (DateTime.Now < dtEnd)
{
i++;
Thread.Sleep(1);
}
Console.WriteLine(i.ToString());
i = 0;
long lStart = DateTime.Now.Ticks;
while (i++ < 1000)
Thread.Sleep(1);
long lTmp = (DateTime.Now.Ticks - lStart) / 10000;
Console.WriteLine(lTmp.ToString());
Console.Read();
}
}
}
С помощью приведенного выше кода мой первый результат дал 946. Таким образом, за промежуток времени в 1 секунду при использовании сна в 1 мс я получил 946 пробуждений. Это очень близко к 1 мс.
Вторая часть спрашивает, сколько времени требуется, чтобы выполнить 1000 событий сна при 1 мс каждый. Я получил 1034 мс. Опять же, почти 1 мс.
Это было на 1,8 ГГц core2duo + Win7 с использованием .Net 4.0
Редактировать: запомните, сон (x) не означает, что вы просыпаетесь в это время, это значит, разбудите меня не раньше этого время. Это не гарантировано. Хотя вы можете увеличить приоритет потока, и Windows должна запланировать ваш поток до потоков с более низким приоритетом.
"bradtgmurray" правильно, но для компиляторов Visual C ++ вам все равно нужно явно экспортировать свою функцию. Но использование файла .DEF, как предлагает "Serge-appTranslator", - неправильный способ сделать это.
Используя инструкцию declspec (dllexport / dllimport), который работает как для кода C, так и для кода C ++, независимо от того, декорирован он или нет (тогда как .DEF ограничен C, если вы не хотите украсить свой код вручную).
Итак, правильный способ экспорта недекорированных функций в Visual C ++ - это комбинирование идиома экспорта "C", как отвечает "bradtgmurray", и ключевое слово dllimport / dllexport.
В качестве примера я создал на Visual C ++ пустой проект DLL и написал две функции, одну назвали CPP, потому что он был украшен, а другой C, потому что это не так. Код следующий:
// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;
// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;
Я думаю, вы уже знаете, но для полноты картины макрос MY_DLL_API должен быть определен в make-файле DLL (т.е. VCPROJ), но не пользователями DLL.
Код C ++ прост написать, но для полноты картины я напишу его ниже:
// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
return 42 * v ;
}
extern "C"
{
// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
return 42 * v ;
}
} ;
Заключите определения функций в extern "C" {}
extern "C" {
void foo() {}
}
См. http://www.parashift.com/c++-faq-lite/mixing-c-and- cpp.html
Вы можете избежать любых изменений (C ++, cdecl, stdcall, ...) для экспортируемых функций, используя файл .def с разделом EXPORTS. Просто создайте файл MyDll.def и добавьте его в свой проект:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
На самом деле, скорее всего, мастер уже создал для вас файл def. Вам просто нужно заполнить раздел ЭКСПОРТ.