Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

потоки   Найти похожие ветки 

 
Альберт ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
15-1190521963
Nastena
2007-09-23 08:32
2007.10.28
Как установить Виндуоз ХР с форматирование диска


2-1191390380
kyn66
2007-10-03 09:46
2007.10.28
TreeView программное управление


15-1191598424
Nikfel
2007-10-05 19:33
2007.10.28
DVD-Recoder.


15-1190980203
Booka Shade
2007-09-28 15:50
2007.10.28
Клик мышкой


2-1191432426
artkil
2007-10-03 21:27
2007.10.28
Строки TListView