Multiprocesszoros futás

Multiprocesszoros futás
2017-03-22T13:16:53+01:00
2017-03-23T13:43:20+01:00
2022-12-04T11:10:43+01:00
pluszs
Sziasztok!

Most éppen Delphi 5-ben írom a kódjaimat.
Azzal szembesültem, hogy ha a "GetLogicalProcessorInformation" híváson keresztül lekérdezem (a válasz elemzésével kiszámolom )  a használható logikai processzorok számát, és egy adatsor külön-külön részeit feldolgozni kívánt feladatra elindítok ugyanannyi Thread-et (CreateThread hívással), akkor a Feladatkezelő jelzi, hogy sikerült a teljes terhelést elérni, és az adatok "gyorsan" feldolgozásra kerülnek. Hurrá, így is képzeltem el.
Azonban, ha ezt a feladatot "kiszervezem" egy DLL-be, és ugyan ezt a hívást (GetLogicalProcessorInformation) kiadom, ugyan ezt a logikai processzorszámot kapva (naná) elindítok ennyi Thread-et (CreateThread hívással) csak egy Thread lesz aktív egy időben. Sikeresnek mondja a hívásokat, megkapom az elindított Thread-ek Handle értékeét, de a 2. csak akkor injdul, ha az első kilépett, majd a 3. csak akkor ha a 2. kilépett és így tovább.
Ezt az alábbi kódrészzel ellenőriztem is:

var proccn: Dword = 0; procmx: Dword = 0; // A thread művelete. procedure multhr(ellpar: PMULPAR); Assembler; stdcall; asm inc [proccn] . . . . mov eax,[proccn] cmp eax,[procmx] jb @qq mov [procmx],eax @qq: dec [proccn] end;
A DLL-ben futó kód 1-es procmx-et, míg a "főprogramban" futó a maximális számmal azonos értéket (8) mutat.
Lehet DLL-ben is egyszerre több logikai processzort használni?
Mutasd a teljes hozzászólást!
Kis keresgéléssel olyat találtam, hogy ha DLL-be rakod a cuccaidat, akkor ott neked kell engedélyezni, hogy multithread-et támogassa, ezt pedig a DLL fő .dpr-jében teheted meg:

begin IsMultiThread := True; end.
Mutasd a teljes hozzászólást!

  • Lehet DLL-ben is egyszerre több logikai processzort használni?

    Persze hogy lehet. A DLL nem varázslat, "csak" egy megoldás arra, hogy ugyanazt a kódot több folyamat is lássa egyszerre. Amit a főprogramhoz tartozó kód meg tud csinálni, azt a DLL-ből betöltött kód is meg tudja.

    Valami más lesz a probléma, de látatlanban nem tudunk helyetted debugolni. Lehet, hogy valami közös erőforrást foglal le (esetleg véletlenül) a kód, és így a többi szál kódja várakozni kényszerül, amíg az erőforrás fel nem szabadul.
    Mutasd a teljes hozzászólást!
  • Kis keresgéléssel olyat találtam, hogy ha DLL-be rakod a cuccaidat, akkor ott neked kell engedélyezni, hogy multithread-et támogassa, ezt pedig a DLL fő .dpr-jében teheted meg:

    begin IsMultiThread := True; end.
    Mutasd a teljes hozzászólást!
  • Köszi!

    A DLL-nek és az azt hívó programnak külön-külön van IsMultiThread
    változója!  Igen!!!  Ez volt a gondom. 
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd