我用了CreateThread做了多线程
想让多核的CPU的核心1,2分别运行我的线程1,2 怎么办啊????

解决方案 »

  1.   

    调用API SetThreadAffinityMask设置线程与CPU的亲缘关系
      

  2.   

    参考:
    //---------------------------------------------------------------------------#ifndef MainH
    #define MainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Buttons.hpp>
    //---------------------------------------------------------------------------
    class TCPUTester:public TThread
    {
    private:
    TSpeedButton *FButton;
    void __fastcall Execute(void);
    public:
    __fastcall TCPUTester(TSpeedButton *Button,
    bool CreateSuspended=true,
    unsigned long CPUMark=1);
    __fastcall ~TCPUTester(void);
    };
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
    TSpeedButton *SpeedButton1;
    TSpeedButton *SpeedButton2;
    TSpeedButton *SpeedButton3;
    TSpeedButton *SpeedButton4;
    TSpeedButton *SpeedButton5;
    TSpeedButton *SpeedButton6;
    TSpeedButton *SpeedButton7;
    TSpeedButton *SpeedButton8;
    TSpeedButton *SpeedButton9;
    TSpeedButton *SpeedButton10;
    TSpeedButton *SpeedButton11;
    TSpeedButton *SpeedButton12;
    TSpeedButton *SpeedButton13;
    TSpeedButton *SpeedButton14;
    TSpeedButton *SpeedButton15;
    TSpeedButton *SpeedButton16;
    TSpeedButton *SpeedButton17;
    TSpeedButton *SpeedButton18;
    TSpeedButton *SpeedButton19;
    TSpeedButton *SpeedButton20;
    TSpeedButton *SpeedButton21;
    TSpeedButton *SpeedButton22;
    TSpeedButton *SpeedButton23;
    TSpeedButton *SpeedButton24;
    TSpeedButton *SpeedButton25;
    TSpeedButton *SpeedButton26;
    TSpeedButton *SpeedButton27;
    TSpeedButton *SpeedButton28;
    TSpeedButton *SpeedButton29;
    TSpeedButton *SpeedButton30;
    TSpeedButton *SpeedButton31;
    TSpeedButton *SpeedButton32;
    TSpeedButton *SpeedButton33;
    TSpeedButton *SpeedButton34;
    TSpeedButton *SpeedButton35;
    TSpeedButton *SpeedButton36;
    TSpeedButton *SpeedButton37;
    TSpeedButton *SpeedButton38;
    TSpeedButton *SpeedButton39;
    TSpeedButton *SpeedButton40;
    TSpeedButton *SpeedButton41;
    TSpeedButton *SpeedButton42;
    TSpeedButton *SpeedButton43;
    TSpeedButton *SpeedButton44;
    TSpeedButton *SpeedButton45;
    TSpeedButton *SpeedButton46;
    TSpeedButton *SpeedButton47;
    TSpeedButton *SpeedButton48;
    TSpeedButton *SpeedButton49;
    TSpeedButton *SpeedButton50;
    TSpeedButton *SpeedButton51;
    TSpeedButton *SpeedButton52;
    TSpeedButton *SpeedButton53;
    TSpeedButton *SpeedButton54;
    TSpeedButton *SpeedButton55;
    TSpeedButton *SpeedButton56;
    TSpeedButton *SpeedButton57;
    TSpeedButton *SpeedButton58;
    TSpeedButton *SpeedButton59;
    TSpeedButton *SpeedButton60;
    TSpeedButton *SpeedButton61;
    TSpeedButton *SpeedButton62;
    TSpeedButton *SpeedButton63;
    TSpeedButton *SpeedButton64;
    void __fastcall SpeedButton1Click(TObject *Sender);
    void __fastcall FormDestroy(TObject *Sender);
    private: // User declarations
    public: // User declarations
    __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif//---------------------------------------------------------------------------#include <vcl.h>
    #pragma hdrstop#include "Main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;void __fastcall TCPUTester::Execute(void)
    {
    while((!this->Terminated)&&(FButton->Down));
    }__fastcall TCPUTester::TCPUTester(TSpeedButton *Button,
    bool CreateSuspended,
    unsigned long CPUMark)
    :FButton(Button), TThread(CreateSuspended)
    {
    this->FreeOnTerminate=true;
    SetThreadAffinityMask ((void *)this->Handle,1<<(CPUMark-1));
    }
    __fastcall TCPUTester::~TCPUTester(void)
    {
    FButton=NULL;
    }//---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    DWORD ProcessAffinityMask;
    DWORD SystemAffinityMask;
    if(!GetProcessAffinityMask( GetCurrentProcess(),
    &ProcessAffinityMask,
    &SystemAffinityMask))
    {
    Application->Terminate();
    }
    for(int i=0;i<sizeof(SystemAffinityMask)*8;i++)
    {
    if(SystemAffinityMask&(1<<i))
    {
    dynamic_cast<TSpeedButton*>(FindComponent("SpeedButton"+IntToStr(i+1)))->Enabled=true;
    }
    }}
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
    if(!Sender->InheritsFrom(__classid(TSpeedButton)))
    {
    return;
    }
    TSpeedButton *Button=dynamic_cast<TSpeedButton*>(Sender);
    if(NULL==Button)
       return;
    if(!Button->Down)
    {
    return;
    }
    TCPUTester *CPUTester=new TCPUTester(Button,true,StrToInt(Button->Caption));
    if(NULL==CPUTester)
    {
    return;
    }
    CPUTester->Resume();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
       for(int i=0;i<ComponentCount;i++)
       {
       TComponent *comp=Components[i];
       if(comp->InheritsFrom(__classid(TSpeedButton)))
       dynamic_cast<TSpeedButton *>(comp)->Down=false;
       }
       Sleep(1000);
    }
    //---------------------------------------------------------------------------
      

  3.   

    原来时用的是SetProcessAffinityMask是针对进程亲缘性的
    呵呵,谢谢三楼
     SetThreadAffinityMask是对线程的,呵呵
      

  4.   

    type
      TCPUTester = Class(TThread)
        private
            FButton: TSpeedButton;
        protected
            procedure Execute;override;
        public
            constructor Create(Button:TSpeedButton ;
                               CreateSuspended: Boolean=true;
                               CPUMark: LongWord=1);
            destructor Destroy;override;
      end;procedure TCPUTester.Execute;
    begin
        while ((Not Terminated) and (FButton.Down)) do;
    end;constructor TCPUTester.Create(Button: TSpeedButton ;
                                CreateSuspended: boolean;
                                CPUMark: LongWord)begin
        FButton := Button;
        Inherited Create(CreateSuspended);
        FreeOnTerminate:=true;
        SetThreadAffinityMask (Handle,1 shr (CPUMark-1));
    end;
    destructor TCPUTester.Destroy;
    begin
        FButton:=NIL;
        Inherited;
    end;//---------------------------------------------------------------------------
    procedure TForm1.FormCreate(Sender: TObject);
    var
        ProcessAffinityMask: LongWord;
        SystemAffinityMask: LongWord;
        I: Integer;
    begin
        if Not(GetProcessAffinityMask(    GetCurrentProcess(),
                                    ProcessAffinityMask,
                                    SystemAffinityMask)) then begin
            Application.Terminate();
            exit;
        end;    for  i:=0 to sizeof(SystemAffinityMask)*8 - 1 do begin
            if(SystemAffinityMask and (1 shr i)) <> 0 then
            begin
                TSpeedButton(FindComponent('SpeedButton'+IntToStr(i+1))).Enabled:=true;
            end;
        end;end;
    //---------------------------------------------------------------------------
    procedure TForm1.SpeedButton1Click(Sender: TObject );
    var
      CPUTester:TCPUTester ;
      Button: TSpeedButton ;
    begin
        if Not (Sender Is TSpeedButton) then
        begin
            Exit;
        end;
        Button:=Sender as TSpeedButton;
        if(NIL=Button)then Exit;    if Not(Button.Down) then
        begin
            Exit;
        end;
        CPUTester:= TCPUTester.Create(Button,true,StrToInt(Button.Caption));
        if(NIL=CPUTester) then
        begin
            exit;
        end;
        CPUTester.Resume();
    end;
    //---------------------------------------------------------------------------
    procedure TForm1.FormDestroy(Sender: TObject );
    var
      I: Integer;
      comp: TComponent;
    begin
       for i:=0 to ComponentCount-1 do
       begin
           comp:=Components[i];
           if(comp is TSpeedButton) then
             TSpeedButton(comp).Down:=false;
       end;
       Sleep(1000);
    end;
    //---------------------------------------------------------------------------