Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Внизпотоки Найти похожие ветки
← →
Альберт © (2007-10-05 01:28) [0]Привет, ребят подскажите, плз, как на WinApi реализовать 2 потока?
← →
Zeqfreed © (2007-10-05 01:33) [1]http://msdn2.microsoft.com/en-us/library/ms682516.aspx
← →
Альберт © (2007-10-05 02:38) [2]{*********************************}
{ Generated by c2pas32 v0.9b }
{ (c) 2001 Oleg Bulychov }
{ Gladiators Software }
{ http://www.astonshell.com/ }
{*********************************}
//unit sex_c;
//interface
uses Windows;
//{$include <windows>}
//{$include <tchar.h>}
//{$include <strsafe.h>}
const
MAX_THREADS = 3;
BUF_SIZE = 255;
const HEAP_ZERO_MEMORY = $00000008;
type
MyData = record
val1: integer;
val2: integer;
end;
//MYDATA = MyData;
PMYDATA = ^MyData;
//implementation
function MyThread(lpParam: pointer): DWORD; stdcall;
var
hStdout: THandle;
pData: PMYDATA;
msgBuf: array [0..Pred(BUF_SIZE)] of CHAR;
cchStringSize: byte;
dwChars: DWORD;
begin
hStdout:= GetStdHandle(STD_OUTPUT_HANDLE);
if hStdout=INVALID_HANDLE_VALUE
then
begin
result:= 1;
exit;
(* Cast the parameter to the correct data type.*)
end;
pData:= {!!!a type cast? =>} {PMYDATA(}lpParam;
//StringCchPrintf(msgBuf,BUF_SIZE,TEXT("Parameters = %d, %d"#13#10""),pData.val1,pData.val2);
(* Print the parameter values using thread-safe functions.*)
// StringCchLength(msgBuf,BUF_SIZE, and cchStringSize);
//WriteConsole(hStdout,@msgBuf,cchStringSize,dwChars,0{nil});
begin
result:= 0;
exit;
end;
end;
function _tmain(): integer;
var
pData: PMYDATA;
dwThreadId: array [0..Pred(MAX_THREADS)] of DWORD;
hThread: PWOHandleArray;//array [0..Pred(MAX_THREADS)] of THandle;
i: integer;
begin
for{while} i:=0 to Pred(MAX_THREADS) { i++ }
do
begin
pData:= {!!!a type cast? =>} {PMYDATA(}HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(MYDATA));
if pData=nil
then begin messagebox(0,"","",0);
ExitProcess(2);
messagebox(0,"","",0);
end;
pData.val1:= i;
pData.val2:= i+100;
hThread[i]:= CreateThread(0{nil},0,@MyThread,pData,0, dwThreadId[i]);
if hThread[i]=0{nil}
then
end;
begin
for{while} i:=0 to Pred(MAX_THREADS) { i++}
do
begin
if hThread[i]<>0{nil}
then
begin
CloseHandle(hThread[i]);
end;
end;
HeapFree(GetProcessHeap(),0,pData);
ExitProcess(i);
end;
WaitForMultipleObjects(MAX_THREADS,hThread,LongBool(1),INFINITE);
for{while} i:=0 to Pred(MAX_THREADS) { i++}
do
begin
CloseHandle(hThread[i]);
end;
HeapFree(GetProcessHeap(),0,pData);
begin
result:= 0;
exit;
end;
end;
begin
_tmain;
end.
перевел.. не так что-то
← →
MBo © (2007-10-05 07:01) [3]что должны делать потоки?
← →
Альберт Мобайл (2007-10-05 10:23) [4]один поток создает окно и получает сообщения от окна, а второй проверяет циклами наличие чужого процесса. вроде бы больше пока ничо не нужно. выше с си на дельфи перевод сделал примера, данного о ссылке
← →
Сергей М. © (2007-10-05 10:33) [5]
> один поток создает окно и получает сообщения от окна, а
> второй проверяет циклами наличие чужого процесса
А третий чем у тебя занят ?
Впрочем что-то не видно в коде ни "окна", ни "получения сообщения от окна", ни "проверки циклами наличия чужого процесса"
← →
MBo © (2007-10-05 10:50) [6]Пишешь минимальное приложение без VCL - создание окна, цикл обработки сообщений.
Таким образом, один (первичный) поток уже есть.
Далее создаешь поточную функцию для дополнительного потока и запускаешь доп. поток функцией BeginThread (или CreateThread на худой конец, заметь, что прототипы поточных функций различаются)
← →
DiamondShark © (2007-10-05 11:15) [7]
> или CreateThread на худой конец
И молиться, молиться, молиться...
← →
Инс © (2007-10-05 11:22) [8]
> И молиться, молиться, молиться...
А атеистам - ручками выставить IsMultiThread, поместить тело потока в SEH-фрейм и инициализировать FPU.
← →
Альберт Мобайл (2007-10-05 11:42) [9]да я только перевел. пытаюсь разобраться. в юр вузе учусь.азы программирования на винапи ищу по инету всему.
чуть позже постараюсь все написать.
итак, 2 потока
первый проверяет наличие чужого окна в системе. isWindow(wnd:hwnd)
2й ловит сообщения созданного моим приложением окна.
примерный код (сейчас не у компа)
function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
begin
case msg of
WM_Destroy:
begin
PostQuitMessage (0);
Result := 0;
Exit;
end;
else
Result := DefWindowProc(wnd,msg,wparam,lparam);
end;
end;
// Ристрация класса окна
begin
window.cbSize := sizeof (window);
window.style := CS_HREDRAW or CS_VREDRAW;
window.lpfnWndProc := @WindowProc;
window.cbClsExtra := 0;
window.cbWndExtra := 0;
window.hInstance := HInstance;
window.hIcon := LoadIcon (0,IDI_APPLICATION);
window.hCursor := LoadCursor (0,IDC_ARROW);
window.hbrBackground:=Color_BtnFace+12;
window.lpszMenuName := nil;
window.lpszClassName := "Main_Window";
RegisterClassEx (window);
// Создание окна на основе созданного класса
Mwindow := CreateWindowEx(0,"Main_Window","First_WinAPI_Programm", WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil);
// Показать созданное окно
SHOWWINDOW (Mwindow,SW_Show);
// Цикл обработки сообщений
2й используется здесь
while GetMessage (Mmsg,0,0,0) do
begin
TranslateMessage (Mmsg);
DispatchMessage (Mmsg);
end;
← →
Альберт Мобайл (2007-10-05 11:44) [10]ребят, спасибо! сейчас попробую!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c