Главная страница
    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.48 MB
Время: 0.068 c
2-1191402557
Washington
2007-10-03 13:09
2007.10.28
Выбор принтера


11-1174745393
SergeR
2007-03-24 17:09
2007.10.28
USE_NAMES и KOLActionList ошибка


2-1191178266
kalexi
2007-09-30 22:51
2007.10.28
CreateFile - считывание дискеты в файл и обратная запись на нее


15-1191392863
andreoman
2007-10-03 10:27
2007.10.28
как копировать временный файл из Opera


2-1191475503
PPop
2007-10-04 09:25
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский