Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.048 c
9-1162381901
DI FES
2006-11-01 14:51
2007.10.28
Помогите Пожалуйста!


2-1191918318
Riply
2007-10-09 12:25
2007.10.28
Внутренняя механика работы NtOpenFile.


2-1191770141
Alex-r
2007-10-07 19:15
2007.10.28
Как заархивировать несколько файлов в один архив?


1-1186729609
vamp_avp
2007-08-10 11:06
2007.10.28
Передача данных в Word


2-1191521205
hinst
2007-10-04 22:06
2007.10.28
Сдерживание потоков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский