Один из способов сделать это
data have;
input Time Group Event $ Value ;
datalines;
1 1 NA 0
2 1 NA 0
3 1 Begin 1.1
4 1 NA 1.2
5 1 NA 1.3
6 1 End 1.4
7 1 NA 0
1 2 NA 0
2 2 Begin 1.1
3 2 NA 1.2
4 2 End 1.3
5 2 NA 1.4
;
data have2(keep= Group min_var max_var);
set have;
by group;
retain min_var max_var;
if trim(Event)= "Begin" then min_var =_n_ ;
if trim(Event)= "End" then max_var =_n_;
if last.group;
run;
data want;
merge have have2;
by group;
if _n_ ge min_var and _n_ le max_var ;
drop min_var max_var;
run;
Вы не должны использовать необработанный Win32 CreateThread()
API.
Используйте время выполнения C _beginthreadex()
таким образом, время выполнения имеет возможность настроить ее собственную поддержку потока.
Можно использовать любого функция CRT _beginthreadex () или Windows API function CreateThread (). _beginthreadex () требуется для ранних версий VC ++, который имел CRT, который лениво не инициализировал локальную память потока. CreateThread () прекрасен, по крайней мере, в VS2005 и.
при поиске платформенно независимого метода используйте повышение
существует также beginthread () и beginthreadex () функции. Оба, кажется, дополнительны к Win32 API, в некотором смысле что во многих вариантах использования, все еще необходимо вызвать некоторые функции Win32 (такие как CloseHandle для beginthreadex). Так, если Вы не заботитесь так очень о совместимости платформ, Вы могли бы также сократить прелюдию и использовать CreateThread ().
Обработка потока Win32 документируется здесь: http://msdn.microsoft.com/en-us/library/ms684852 (По сравнению с 85) .aspx
[edit1] пример:
DWORD WINAPI MyThreadProc( void* pContext )
{
return 0;
}
HANDLE h = CreateThread( NULL, 0, MyThreadProc, this, 0L, NULL );
WaitForSingleObject(h, TIME); // wait for thread to exit, TIME is a DWORD in milliseconds
[edit2] CRT & CreateThread ():
на MSDN:
Поток в исполняемом файле, который называет библиотеку времени выполнения C (CRT), должен использовать _beginthreadex и функции _endthreadex для управления потоком, а не CreateThread и ExitThread; это требует использования многопоточной версии CRT. Если поток, созданный с помощью CreateThread, называет CRT, CRT может завершить процесс в условиях низкой памяти.
Вы, вероятно, хотите смотреть на CreateThread () функция.
Использовать _beginthread()
или _beginthreadex()
создать новый поток. Не используйте функцию Win32 CreateThread()
- это правильно не инициализирует многопоточные аспекты времени выполнения C. См. также этот вопрос.
Некоторые хорошие книги по предмету являются Windows Программирования Petzold и Приложениями Программирования Richter для Windows. В частности, последние движения в сторону сервера, программируя, такие как поток и синхронизация API в большой глубине.
Править: Для фрагментов кода Google является Вашим другом. Например, Эта статья имеет некоторые минимальные примеры потока.
Существует также _beginthread () функция, которую можно искать. Это отличается немного от CreateThread (), необходимо знать о различиях прежде, чем выбрать то.