tantative création programme

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

tantative création programme

Message par dayvid »

Salut !

J'ai travailler tout mon week-end (quelque heures) a essayer divers chose
partit de rien et arriver a quelque chose de pas trop mal

Bien je vous explique tous ça:

Je croix si je me souvient bien que ma première idée a été de crée
une procédure pour faire une impression de mon écran

Chose que j'ai réussie très vite grasse a un petit code prix dans un autre

Une fois ça fait, j'ai penser a un logiciel de création de capture d'écran
en chaine, alors je poursuivie dans cette nouvel voie

Mais hélas j'ai butter bien vite sur un très gros problème !

En effet, la procédure qui me permettais de prendre l'écran en photo
c'est révéler plus que lente !

Mais aussi certaines commandes !

J'ai donc essayer d'optimiser un maximum le code !

Et j'y suis arriver a ma grande surprise !

Une fois tous ça réaliser j'ai commencer le travail dans cette voie

Cependant cella étais encore bien trop lent !

Après avoir compris quel étais le problème, je me suis mis a la création
de Thread pour la création des image en masse

Après pal mal de temps, le temps de tous mettre en place
je créa donc deux Thread charger de crée les images

Exemple: 100 images diviser par deux Thread = 50 chacun

Bon j'ai ramer pour mettre ça en place, j'ai donc par la suite utiliser
des « Semaphore » pour qu'il n'y est pas de conflit l'or de la création des images

Une fois ceci réaliser, je découvris que ce procéder fonctionnais bien !

Non seulement la vitesse de création d'images étais optimiser
mais aussi l'impression de celle-ci !

J'ai par la suite optimiser encore le code en mettent cette fois-ci 4 Thread !
Et cela a été un véritable succer !

Puis j'a i fait d'autre essaie, en mettent 5 Thread, puis 10 !!!
Mais je me rendi compte que cella ne fonctionnais pas du tous

oui en effet, les Thread se ralentissais les uns aux autres
du coup c'était bien moins rapide

Bien, j'ai enregistrer certaine étape de mon travail pour voir ce que j'ai fait
cependant je suis bien loin de terminer car trop de soucis de rapidité
surtout pour enregistrer par la suite les nombreuses images générer par le programme

Voilà, après avoir bosser, je vous demande votre aide pour savoir comment procéder pour
que sa ail beaucoup plus vite, le soucis n° 1 étang la rapidité du programme, il est a noté que
plus les images sont grand et moins vite va le programme, quoique ya des nuance tous
de même que je n'est pas saisie, bref je demande votre aide pour poursuivre !

1:

Code : Tout sélectionner


Global Image
Global X = 1
Global Y = 1
Global NumeroImage = 1
Global Largeur = 1600
Global Hauteur = 1200
Global ImageImpressionEcrant
Global Drawing

ImageImpressionEcrant = CreateImage(NumeroImage, Largeur ,Hauteur)
Drawing = StartDrawing(ImageOutput(NumeroImage))

Procedure ImpressionEcrant(NumeroImage, X ,Y ,Largeur ,Hauteur)
  t = ElapsedMilliseconds()
  GetDC_ = GetDC_(GetDesktopWindow_())
  BitBlt_(Drawing, 0, 0, Largeur ,Hauteur, GetDC_, X, Y, #SRCCOPY)
  ReleaseDC_(GetDesktopWindow_(), GetDC_)
  t6 = ElapsedMilliseconds()
  Debug t - t6
  ProcedureReturn ImageImpressionEcrant
EndProcedure

UsePNGImageEncoder()

Enumeration
  #Window_0
  #Image
EndEnumeration

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 284, 107, 800, 600, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )

  EndIf
  
  Repeat ; Start of the event loop
    
  a + 1
    
  Event = WaitWindowEvent(1) ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  image = ImpressionEcrant(1 ,1 ,1 ,1600 ,1200)
  
  ;SaveImage(#Image, "Image n°" + Str(a) + ".Png", #PB_ImagePlugin_PNG, 0, 32)
  ;Debug a
  
  If Event = #PB_Event_Gadget
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop
EndProcedure

Open_Window_0()
StopDrawing()
; IDE Options = PureBasic 4.51 (Windows - x86)
; CursorPosition = 19
; Folding = -
; EnableXP
; EnableUser
; EnableOnError
; EnableCompileCount = 176
; EnableBuildCount = 0
; EnableExeConstant
2:

Code : Tout sélectionner

UsePNGImageEncoder()

Enumeration
  #Window_0
EndEnumeration

Global ImageX = 1
Global ImageY = 1
Global LargeurImage = 1600
Global HauteurImage = 1200
Global NombreImage = 350

Global CreationImageThread1 = 0
Global CreationImageThread2 = 0
Global CreationImageThread3 = 0
Global CreationImageThread4 = 0
Global CreationImageThread5 = 0
Global CreationImageThread6 = 0
Global CreationImageThread7 = 0
Global CreationImageThread8 = 0
Global CreationImageThread9 = 0
Global CreationImageThread10 = 0

Global ImageRestante = 0
Global Thread1, Thread2, Thread3, Thread4, Thread5, Thread6, Thread7, Thread8, Thread9, Thread10
Global NombreImageTotaleCree

Global NewList StokageImage()
Global NewList StokageImage1()
Global NewList StokageImage2()
Global NewList StokageImage3()
Global NewList StokageImage4()
Global NewList StokageImage5()
Global NewList StokageImage6()
Global NewList StokageImage7()
Global NewList StokageImage8()
Global NewList StokageImage9()
Global NewList StokageImage10()

Global NewList NumeroImage()
Global NewList NumeroImage1()
Global NewList NumeroImage2()
Global NewList NumeroImage3()
Global NewList NumeroImage4()
Global NewList NumeroImage5()
Global NewList NumeroImage6()
Global NewList NumeroImage7()
Global NewList NumeroImage8()
Global NewList NumeroImage9()
Global NewList NumeroImage10()


Global Semaphore = CreateSemaphore()
SignalSemaphore(Semaphore)

; Procedure PrecalculationTailleImageMemoire(NombreImage, LargeurImage, HauteurImage)
;   *MemoireID = AllocateMemory(LargeurImage * HauteurImage * NombreImage)
;   If *MemoireID
;     Debug "Taille aproximative d'une image = " + StrF(LargeurImage * HauteurImage * 2.512 / 1000 / 1000, 2) + " Mo"
;     Debug "Taille Totale aproximative alouer actuellement = " + StrF(LargeurImage * HauteurImage * 2.512 * NombreImage / 1000 / 1000 * NombreImage, 0) + " Mo"
;     FreeMemory(*MemoireID)
;   Else
;     Debug "Impossible d'allouer la mémoire demandée !"
;   EndIf 
;   ProcedureReturn TailleImageMemoire
; EndProcedure

Procedure ComptabilisationImageCree(Image)
  NombreImageTotaleCree + Image
  ProcedureReturn NombreImageTotaleCree
EndProcedure

Procedure CreationImageThread1(Thread1)
  t1 = ElapsedMilliseconds()
  For NumeroImageThread1 = 1 To NombreImage / 10
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage1())
    StokageImage1() = CreateImage(NumeroImageThread1, LargeurImage ,HauteurImage)
    AddElement(NumeroImage1())
    NumeroImage1() = NumeroImageThread1
    SignalSemaphore(Semaphore)
    Thread1 + 1
    ImageRestante + 1
  Next
  t2 = ElapsedMilliseconds()
  Debug "Le Thread 1 à mis " + Str(t2 - t1) + " Milisecondes pour crée " + Str(Thread1) + " Images"
  CreationImageThread1 = 1
  ComptabilisationImageCree(Thread1)
EndProcedure

Procedure CreationImageThread2(Thread2)
  t3 = ElapsedMilliseconds()
  For NumeroImageThread2 = NombreImage / 10 + 1 To NombreImage / 9
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage2())
    StokageImage2() = CreateImage(NumeroImageThread2, LargeurImage ,HauteurImage)
    AddElement(NumeroImage2())
    NumeroImage2() = NumeroImageThread2
    SignalSemaphore(Semaphore)
    Thread2 + 1
    ImageRestante + 1
  Next
  t4 = ElapsedMilliseconds()
  Debug "Le Thread 2 à mis " + Str(t4 - t3) + " Milisecondes pour crée " + Str(Thread2) + " Images"
  CreationImageThread2 = 1
  ComptabilisationImageCree(Thread2)
EndProcedure

Procedure CreationImageThread3(Thread3)
  t5 = ElapsedMilliseconds()
  For NumeroImageThread3 = NombreImage / 9 + 1 To NombreImage / 8
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage3())
    StokageImage3() = CreateImage(NumeroImageThread3, LargeurImage ,HauteurImage)
    AddElement(NumeroImage3())
    NumeroImage3() = NumeroImageThread3
    SignalSemaphore(Semaphore)
    Thread3 + 1
    ImageRestante + 1
  Next
  t6 = ElapsedMilliseconds()
  Debug "Le Thread 3 à mis " + Str(t6 - t5) + " Milisecondes pour crée " + Str(Thread3) + " Images"
  CreationImageThread3 = 1
  ComptabilisationImageCree(Thread3)
EndProcedure

Procedure CreationImageThread4(Thread4)
  t7 = ElapsedMilliseconds()
  For NumeroImageThread4 = NombreImage / 8 + 1 To NombreImage / 7
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage4())
    StokageImage4() = CreateImage(NumeroImageThread4, LargeurImage ,HauteurImage)
    AddElement(NumeroImage4())
    NumeroImage4() = NumeroImageThread4
    SignalSemaphore(Semaphore)
    Thread4 + 1
    ImageRestante + 1
  Next
  t8 = ElapsedMilliseconds()
  Debug "Le Thread 4 à mis " + Str(t8 - t7) + " Milisecondes pour crée " + Str(Thread4) + " Images"
  CreationImageThread4 = 1
  ComptabilisationImageCree(Thread4)
EndProcedure

Procedure CreationImageThread5(Thread5)
  t9 = ElapsedMilliseconds()
  For NumeroImageThread5 = NombreImage / 7 + 1 To NombreImage / 6
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage5())
    StokageImage5() = CreateImage(NumeroImageThread5, LargeurImage ,HauteurImage)
    AddElement(NumeroImage5())
    NumeroImage5() = NumeroImageThread5
    SignalSemaphore(Semaphore)
    Thread5 + 1
    ImageRestante + 1
  Next
  t10 = ElapsedMilliseconds()
  Debug "Le Thread 5 à mis " + Str(t10 - t9) + " Milisecondes pour crée " + Str(Thread5) + " Images"
  CreationImageThread5 = 1
  ComptabilisationImageCree(Thread5)
EndProcedure

Procedure CreationImageThread6(Thread6)
  t11 = ElapsedMilliseconds()
  For NumeroImageThread6 = NombreImage / 6 + 1 To NombreImage / 5
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage6())
    StokageImage6() = CreateImage(NumeroImageThread6, LargeurImage ,HauteurImage)
    AddElement(NumeroImage6())
    NumeroImage6() = NumeroImageThread6
    SignalSemaphore(Semaphore)
    Thread6 + 1
    ImageRestante + 1
  Next
  t12 = ElapsedMilliseconds()
  Debug "Le Thread 6 à mis " + Str(t12 - t11) + " Milisecondes pour crée " + Str(Thread6) + " Images"
  CreationImageThread6 = 1
  ComptabilisationImageCree(Thread6)
EndProcedure

Procedure CreationImageThread7(Thread7)
  t13 = ElapsedMilliseconds()
  For NumeroImageThread7 = NombreImage / 5 + 1 To NombreImage / 4
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage7())
    StokageImage7() = CreateImage(NumeroImageThread7, LargeurImage ,HauteurImage)
    AddElement(NumeroImage7())
    NumeroImage7() = NumeroImageThread7
    SignalSemaphore(Semaphore)
    Thread7 + 1
    ImageRestante + 1
  Next
  t14 = ElapsedMilliseconds()
  Debug "Le Thread 7 à mis " + Str(t14 - t13) + " Milisecondes pour crée " + Str(Thread7) + " Images"
  CreationImageThread7 = 1
  ComptabilisationImageCree(Thread7)
EndProcedure

Procedure CreationImageThread8(Thread8)
  t15 = ElapsedMilliseconds()
  For NumeroImageThread8 = NombreImage / 4 + 1 To NombreImage / 3
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage8())
    StokageImage8() = CreateImage(NumeroImageThread8, LargeurImage ,HauteurImage)
    AddElement(NumeroImage8())
    NumeroImage8() = NumeroImageThread8
    SignalSemaphore(Semaphore)
    Thread8 + 1
    ImageRestante + 1
  Next
  t16 = ElapsedMilliseconds()
  Debug "Le Thread 8 à mis " + Str(t16 - t15) + " Milisecondes pour crée " + Str(Thread8) + " Images"
  CreationImageThread8 = 1
  ComptabilisationImageCree(Thread8)
EndProcedure

Procedure CreationImageThread9(Thread9)
  t17 = ElapsedMilliseconds()
  For NumeroImageThread9 = NombreImage / 3 + 1 To NombreImage / 2
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage9())
    StokageImage9() = CreateImage(NumeroImageThread9, LargeurImage ,HauteurImage)
    AddElement(NumeroImage9())
    NumeroImage9() = NumeroImageThread9
    SignalSemaphore(Semaphore)
    Thread9 + 1
    ImageRestante + 1
  Next
  t18 = ElapsedMilliseconds()
  Debug "Le Thread 9 à mis " + Str(t18 - t17) + " Milisecondes pour crée " + Str(Thread9) + " Images"
  CreationImageThread9 = 1
  ComptabilisationImageCree(Thread9)
EndProcedure

Procedure CreationImageThread10(Thread10)
  t19 = ElapsedMilliseconds()
  For NumeroImageThread10 = NombreImage / 2 + 1 To NombreImage
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage10())
    StokageImage10() = CreateImage(NumeroImageThread10, LargeurImage ,HauteurImage)
    AddElement(NumeroImage10())
    NumeroImage10() = NumeroImageThread10
    SignalSemaphore(Semaphore)
    Thread10 + 1
    ImageRestante + 1
  Next
  t20 = ElapsedMilliseconds()
  Debug "Le Thread 10 à mis " + Str(t20 - t19) + " Milisecondes pour crée " + Str(Thread10) + " Images"
  CreationImageThread10 = 1
  ComptabilisationImageCree(Thread10)
EndProcedure

Procedure ImpressionImage(ImageX ,ImageY ,LargeurImage ,HauteurImage)
  t5 = ElapsedMilliseconds()
  FirstElement(NumeroImage())
  ForEach StokageImage()
    ;Debug NumeroImage()
    DrawingImage = StartDrawing(ImageOutput(NumeroImage()))
    GetDC_Image1 = GetDC_(GetDesktopWindow_())
    BitBlt_(DrawingImage, 0, 0, LargeurImage ,HauteurImage, GetDC_Image1, ImageX, ImageY, #SRCCOPY)
    ReleaseDC_(GetDesktopWindow_(), GetDC_Image1)
    StopDrawing()
    NextElement(NumeroImage())
  Next
  t6 = ElapsedMilliseconds()
  Debug "Temps Impression Image = " + Str(t6 - t5)
  CreationImageThread4 = 1
EndProcedure

Procedure EnregistrementImage()
  t1 = ElapsedMilliseconds()
  FirstElement(NumeroImage())
  ForEach StokageImage()
    a + 1
    SaveImage(NumeroImage(), "Image n°" + Str(a) + ".Png", #PB_ImagePlugin_PNG)
    NextElement(NumeroImage())
  Next
  t2 = ElapsedMilliseconds()
  Debug "Temps Enregistrement Image = " + Str(t2 - t1)
EndProcedure

;PrecalculationTailleImageMemoire(NombreImage, LargeurImage, HauteurImage)

CreateThread(@CreationImageThread1(), 0)
CreateThread(@CreationImageThread2(), 0)
CreateThread(@CreationImageThread3(), 0)
CreateThread(@CreationImageThread4(), 0)
CreateThread(@CreationImageThread5(), 0)
CreateThread(@CreationImageThread6(), 0)
CreateThread(@CreationImageThread7(), 0)
CreateThread(@CreationImageThread8(), 0)
CreateThread(@CreationImageThread9(), 0)
CreateThread(@CreationImageThread10(), 0)


Repeat
  Delay(1)
Until CreationImageThread1 = 1 And CreationImageThread2 = 1 And CreationImageThread3 = 1 And CreationImageThread4 = 1 And CreationImageThread5 = 1 And CreationImageThread6 = 1 And CreationImageThread7 = 1 And CreationImageThread8 = 1 And CreationImageThread9 = 1 And CreationImageThread10 = 1

Debug "Nombre d'image totale crée: " + Str(NombreImageTotaleCree)

ForEach StokageImage1()
  AddElement(StokageImage())
  StokageImage() = StokageImage1()
Next

ForEach StokageImage2()
  AddElement(StokageImage())
  StokageImage() = StokageImage2()
Next

ForEach StokageImage3()
  AddElement(StokageImage())
  StokageImage() = StokageImage3()
Next

ForEach StokageImage4()
  AddElement(StokageImage())
  StokageImage() = StokageImage4()
Next

ForEach StokageImage5()
  AddElement(StokageImage())
  StokageImage() = StokageImage5()
Next

ForEach StokageImage6()
  AddElement(StokageImage())
  StokageImage() = StokageImage6()
Next

ForEach StokageImage7()
  AddElement(StokageImage())
  StokageImage() = StokageImage7()
Next

ForEach StokageImage8()
  AddElement(StokageImage())
  StokageImage() = StokageImage8()
Next

ForEach StokageImage9()
  AddElement(StokageImage())
  StokageImage() = StokageImage9()
Next

ForEach StokageImage10()
  AddElement(StokageImage())
  StokageImage() = StokageImage10()
Next


ForEach NumeroImage1()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage1()
Next

ForEach NumeroImage2()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage2()
Next

ForEach NumeroImage3()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage3()
Next

ForEach NumeroImage4()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage4()
Next

ForEach NumeroImage5()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage5()
Next

ForEach NumeroImage6()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage6()
Next

ForEach NumeroImage7()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage7()
Next

ForEach NumeroImage8()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage8()
Next

ForEach NumeroImage9()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage9()
Next

ForEach NumeroImage10()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage10()
Next

;ImpressionImage(ImageX ,ImageY ,LargeurImage ,HauteurImage)

;EnregistrementImage()

; IDE Options = PureBasic 4.51 (Windows - x86)
; CursorPosition = 55
; FirstLine = 11
; Folding = ---
; EnableXP
; EnableUser
; EnableOnError
; EnableCompileCount = 665
; EnableBuildCount = 0
; EnableExeConstant
3:

Code : Tout sélectionner

UsePNGImageEncoder()

Enumeration
  #Window_0
EndEnumeration

Global ImageX = 1
Global ImageY = 1
Global LargeurImage = 1600
Global HauteurImage = 1200
Global NombreImage = 350

Global CreationImageThread1 = 0
Global CreationImageThread2 = 0
Global CreationImageThread3 = 0
Global CreationImageThread4 = 0
Global CreationImageThread5 = 0
Global CreationImageThread6 = 0
Global CreationImageThread7 = 0
Global CreationImageThread8 = 0
Global CreationImageThread9 = 0
Global CreationImageThread10 = 0

Global ImageRestante = 0
Global Thread1, Thread2, Thread3, Thread4, Thread5, Thread6, Thread7, Thread8, Thread9, Thread10
Global NombreImageTotaleCree

Global NewList StokageImage()
Global NewList StokageImage1()
Global NewList StokageImage2()
Global NewList StokageImage3()
Global NewList StokageImage4()
Global NewList StokageImage5()
Global NewList StokageImage6()
Global NewList StokageImage7()
Global NewList StokageImage8()
Global NewList StokageImage9()
Global NewList StokageImage10()

Global NewList NumeroImage()
Global NewList NumeroImage1()
Global NewList NumeroImage2()
Global NewList NumeroImage3()
Global NewList NumeroImage4()
Global NewList NumeroImage5()
Global NewList NumeroImage6()
Global NewList NumeroImage7()
Global NewList NumeroImage8()
Global NewList NumeroImage9()
Global NewList NumeroImage10()


Global Semaphore = CreateSemaphore()
SignalSemaphore(Semaphore)

; Procedure PrecalculationTailleImageMemoire(NombreImage, LargeurImage, HauteurImage)
;   *MemoireID = AllocateMemory(LargeurImage * HauteurImage * NombreImage)
;   If *MemoireID
;     Debug "Taille aproximative d'une image = " + StrF(LargeurImage * HauteurImage * 2.512 / 1000 / 1000, 2) + " Mo"
;     Debug "Taille Totale aproximative alouer actuellement = " + StrF(LargeurImage * HauteurImage * 2.512 * NombreImage / 1000 / 1000 * NombreImage, 0) + " Mo"
;     FreeMemory(*MemoireID)
;   Else
;     Debug "Impossible d'allouer la mémoire demandée !"
;   EndIf 
;   ProcedureReturn TailleImageMemoire
; EndProcedure

Procedure ComptabilisationImageCree(Image)
  NombreImageTotaleCree + Image
  ProcedureReturn NombreImageTotaleCree
EndProcedure

Procedure CreationImageThread1(Thread1)
  t1 = ElapsedMilliseconds()
  For NumeroImageThread1 = 1 To NombreImage / 5
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage1())
    StokageImage1() = CreateImage(NumeroImageThread1, LargeurImage ,HauteurImage)
    AddElement(NumeroImage1())
    NumeroImage1() = NumeroImageThread1
    SignalSemaphore(Semaphore)
    Thread1 + 1
    ImageRestante + 1
  Next
  t2 = ElapsedMilliseconds()
  Debug "Le Thread 1 à mis " + Str(t2 - t1) + " Milisecondes pour crée " + Str(Thread1) + " Images"
  CreationImageThread1 = 1
  ComptabilisationImageCree(Thread1)
EndProcedure

Procedure CreationImageThread2(Thread2)
  t3 = ElapsedMilliseconds()
  For NumeroImageThread2 = NombreImage / 5 + 1 To NombreImage / 4
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage2())
    StokageImage2() = CreateImage(NumeroImageThread2, LargeurImage ,HauteurImage)
    AddElement(NumeroImage2())
    NumeroImage2() = NumeroImageThread2
    SignalSemaphore(Semaphore)
    Thread2 + 1
    ImageRestante + 1
  Next
  t4 = ElapsedMilliseconds()
  Debug "Le Thread 2 à mis " + Str(t4 - t3) + " Milisecondes pour crée " + Str(Thread2) + " Images"
  CreationImageThread2 = 1
  ComptabilisationImageCree(Thread2)
EndProcedure

Procedure CreationImageThread3(Thread3)
  t5 = ElapsedMilliseconds()
  For NumeroImageThread3 = NombreImage / 4 + 1 To NombreImage / 3
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage3())
    StokageImage3() = CreateImage(NumeroImageThread3, LargeurImage ,HauteurImage)
    AddElement(NumeroImage3())
    NumeroImage3() = NumeroImageThread3
    SignalSemaphore(Semaphore)
    Thread3 + 1
    ImageRestante + 1
  Next
  t6 = ElapsedMilliseconds()
  Debug "Le Thread 3 à mis " + Str(t6 - t5) + " Milisecondes pour crée " + Str(Thread3) + " Images"
  CreationImageThread3 = 1
  ComptabilisationImageCree(Thread3)
EndProcedure

Procedure CreationImageThread4(Thread4)
  t7 = ElapsedMilliseconds()
  For NumeroImageThread4 = NombreImage / 3 + 1 To NombreImage / 2
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage4())
    StokageImage4() = CreateImage(NumeroImageThread4, LargeurImage ,HauteurImage)
    AddElement(NumeroImage4())
    NumeroImage4() = NumeroImageThread4
    SignalSemaphore(Semaphore)
    Thread4 + 1
    ImageRestante + 1
  Next
  t8 = ElapsedMilliseconds()
  Debug "Le Thread 4 à mis " + Str(t8 - t7) + " Milisecondes pour crée " + Str(Thread4) + " Images"
  CreationImageThread4 = 1
  ComptabilisationImageCree(Thread4)
EndProcedure

Procedure CreationImageThread5(Thread5)
  t9 = ElapsedMilliseconds()
  For NumeroImageThread5 = NombreImage / 4 + 1 To NombreImage
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage5())
    StokageImage5() = CreateImage(NumeroImageThread5, LargeurImage ,HauteurImage)
    AddElement(NumeroImage5())
    NumeroImage5() = NumeroImageThread5
    SignalSemaphore(Semaphore)
    Thread5 + 1
    ImageRestante + 1
  Next
  t10 = ElapsedMilliseconds()
  Debug "Le Thread 5 à mis " + Str(t10 - t9) + " Milisecondes pour crée " + Str(Thread5) + " Images"
  CreationImageThread5 = 1
  ComptabilisationImageCree(Thread5)
EndProcedure

Procedure ImpressionImage(ImageX ,ImageY ,LargeurImage ,HauteurImage)
  t5 = ElapsedMilliseconds()
  FirstElement(NumeroImage())
  ForEach StokageImage()
    ;Debug NumeroImage()
    DrawingImage = StartDrawing(ImageOutput(NumeroImage()))
    GetDC_Image1 = GetDC_(GetDesktopWindow_())
    BitBlt_(DrawingImage, 0, 0, LargeurImage ,HauteurImage, GetDC_Image1, ImageX, ImageY, #SRCCOPY)
    ReleaseDC_(GetDesktopWindow_(), GetDC_Image1)
    StopDrawing()
    NextElement(NumeroImage())
  Next
  t6 = ElapsedMilliseconds()
  Debug "Temps Impression Image = " + Str(t6 - t5)
  CreationImageThread4 = 1
EndProcedure

Procedure EnregistrementImage()
  t1 = ElapsedMilliseconds()
  FirstElement(NumeroImage())
  ForEach StokageImage()
    a + 1
    SaveImage(NumeroImage(), "Image n°" + Str(a) + ".Png", #PB_ImagePlugin_PNG)
    NextElement(NumeroImage())
  Next
  t2 = ElapsedMilliseconds()
  Debug "Temps Enregistrement Image = " + Str(t2 - t1)
EndProcedure

;PrecalculationTailleImageMemoire(NombreImage, LargeurImage, HauteurImage)

CreateThread(@CreationImageThread1(), 0)
CreateThread(@CreationImageThread2(), 0)
CreateThread(@CreationImageThread3(), 0)
CreateThread(@CreationImageThread4(), 0)
CreateThread(@CreationImageThread5(), 0)

Repeat
  Delay(1)
  Until CreationImageThread1 = 1 And CreationImageThread2 = 1 And CreationImageThread3 = 1 And CreationImageThread4 = 1 And CreationImageThread5 = 1

Debug "Nombre d'image totale crée: " + Str(NombreImageTotaleCree)

ForEach StokageImage1()
  AddElement(StokageImage())
  StokageImage() = StokageImage1()
Next

ForEach StokageImage2()
  AddElement(StokageImage())
  StokageImage() = StokageImage2()
Next

ForEach StokageImage3()
  AddElement(StokageImage())
  StokageImage() = StokageImage3()
Next

ForEach StokageImage4()
  AddElement(StokageImage())
  StokageImage() = StokageImage4()
Next

ForEach StokageImage5()
  AddElement(StokageImage())
  StokageImage() = StokageImage5()
Next

;ImpressionImage(ImageX ,ImageY ,LargeurImage ,HauteurImage)

;EnregistrementImage()

; IDE Options = PureBasic 4.51 (Windows - x86)
; CursorPosition = 245
; FirstLine = 202
; Folding = --
; EnableXP
; EnableUser
; EnableOnError
; EnableCompileCount = 670
; EnableBuildCount = 0
; EnableExeConstant
4:

Code : Tout sélectionner

UsePNGImageEncoder()

Enumeration
  #Window_0
EndEnumeration

Global ImageX = 1
Global ImageY = 1
Global LargeurImage = 1600
Global HauteurImage = 1200
Global NombreImage = 350

Global CreationImageThread1 = 0
Global CreationImageThread2 = 0
Global CreationImageThread3 = 0
Global CreationImageThread4 = 0
Global ImageRestante = 0
Global Thread1, Thread2, Thread3, Thread4
Global NombreImageTotaleCree

Global NewList StokageImage()
Global NewList StokageImage1()
Global NewList StokageImage2()
Global NewList StokageImage3()
Global NewList StokageImage4()
Global NewList NumeroImage()
Global NewList NumeroImage1()
Global NewList NumeroImage2()
Global NewList NumeroImage3()
Global NewList NumeroImage4()

Global Semaphore = CreateSemaphore()
SignalSemaphore(Semaphore)

; Procedure PrecalculationTailleImageMemoire(NombreImage, LargeurImage, HauteurImage)
;   *MemoireID = AllocateMemory(LargeurImage * HauteurImage * NombreImage)
;   If *MemoireID
;     Debug "Taille aproximative d'une image = " + StrF(LargeurImage * HauteurImage * 2.512 / 1000 / 1000, 2) + " Mo"
;     Debug "Taille Totale aproximative alouer actuellement = " + StrF(LargeurImage * HauteurImage * 2.512 * NombreImage / 1000 / 1000 * NombreImage, 0) + " Mo"
;     FreeMemory(*MemoireID)
;   Else
;     Debug "Impossible d'allouer la mémoire demandée !"
;   EndIf 
;   ProcedureReturn TailleImageMemoire
; EndProcedure

Procedure ComptabilisationImageCree(Image)
  NombreImageTotaleCree + Image
  ProcedureReturn NombreImageTotaleCree
EndProcedure

Procedure CreationImageThread1(Thread1)
  t1 = ElapsedMilliseconds()
  For NumeroImageThread1 = 1 To NombreImage / 4
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage1())
    StokageImage1() = CreateImage(NumeroImageThread1, LargeurImage ,HauteurImage)
    AddElement(NumeroImage1())
    NumeroImage1() = NumeroImageThread1
    SignalSemaphore(Semaphore)
    Thread1 + 1
    ImageRestante + 1
  Next
  t2 = ElapsedMilliseconds()
  Debug "Le Thread 1 à mis " + Str(t2 - t1) + " Milisecondes pour crée " + Str(Thread1) + " Images"
  CreationImageThread1 = 1
  ComptabilisationImageCree(Thread1)
EndProcedure

Procedure CreationImageThread2(Thread2)
  t3 = ElapsedMilliseconds()
  For NumeroImageThread2 = NombreImage / 4 + 1 To NombreImage / 2
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage2())
    StokageImage2() = CreateImage(NumeroImageThread2, LargeurImage ,HauteurImage)
    AddElement(NumeroImage2())
    NumeroImage2() = NumeroImageThread2
    SignalSemaphore(Semaphore)
    Thread2 + 1
    ImageRestante + 1
  Next
  t4 = ElapsedMilliseconds()
  Debug "Le Thread 2 à mis " + Str(t4 - t3) + " Milisecondes pour crée " + Str(Thread2) + " Images"
  CreationImageThread2 = 1
  ComptabilisationImageCree(Thread2)
EndProcedure

Procedure CreationImageThread3(Thread3)
  t5 = ElapsedMilliseconds()
  For NumeroImageThread3 = NombreImage / 2 + 1 To (NombreImage / 4) * 3
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage3())
    StokageImage3() = CreateImage(NumeroImageThread3, LargeurImage ,HauteurImage)
    AddElement(NumeroImage3())
    NumeroImage3() = NumeroImageThread3
    SignalSemaphore(Semaphore)
    Thread3 + 1
    ImageRestante + 1
  Next
  t6 = ElapsedMilliseconds()
  Debug "Le Thread 3 à mis " + Str(t6 - t5) + " Milisecondes pour crée " + Str(Thread3) + " Images"
  CreationImageThread3 = 1
  ComptabilisationImageCree(Thread3)
EndProcedure

Procedure CreationImageThread4(Thread4)
  t7 = ElapsedMilliseconds()
  For NumeroImageThread4 = (NombreImage / 4) * 3 + 1 To NombreImage
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage4())
    StokageImage4() = CreateImage(NumeroImageThread4, LargeurImage ,HauteurImage)
    AddElement(NumeroImage4())
    NumeroImage4() = NumeroImageThread4
    SignalSemaphore(Semaphore)
    Thread4 + 1
    ImageRestante + 1
  Next
  t8 = ElapsedMilliseconds()
  Debug "Le Thread 4 à mis " + Str(t8 - t7) + " Milisecondes pour crée " + Str(Thread4) + " Images"
  CreationImageThread4 = 1
  ComptabilisationImageCree(Thread4)
EndProcedure

Procedure ImpressionImage(ImageX ,ImageY ,LargeurImage ,HauteurImage)
  t5 = ElapsedMilliseconds()
  FirstElement(NumeroImage())
  ForEach StokageImage()
    ;Debug NumeroImage()
    DrawingImage = StartDrawing(ImageOutput(NumeroImage()))
    GetDC_Image1 = GetDC_(GetDesktopWindow_())
    BitBlt_(DrawingImage, 0, 0, LargeurImage ,HauteurImage, GetDC_Image1, ImageX, ImageY, #SRCCOPY)
    ReleaseDC_(GetDesktopWindow_(), GetDC_Image1)
    StopDrawing()
    NextElement(NumeroImage())
  Next
  t6 = ElapsedMilliseconds()
  Debug "Temps Impression Image = " + Str(t6 - t5)
  CreationImageThread4 = 1
EndProcedure

Procedure EnregistrementImage()
  t1 = ElapsedMilliseconds()
  FirstElement(NumeroImage())
  ForEach StokageImage()
    a + 1
    SaveImage(NumeroImage(), "Image n°" + Str(a) + ".Png", #PB_ImagePlugin_PNG)
    NextElement(NumeroImage())
  Next
  t2 = ElapsedMilliseconds()
  Debug "Temps Enregistrement Image = " + Str(t2 - t1)
EndProcedure

;PrecalculationTailleImageMemoire(NombreImage, LargeurImage, HauteurImage)

CreateThread(@CreationImageThread1(), 0)
CreateThread(@CreationImageThread2(), 0)
CreateThread(@CreationImageThread3(), 0)
CreateThread(@CreationImageThread4(), 0)

Repeat
  Delay(1)
Until CreationImageThread1 = 1 And CreationImageThread2 = 1 And CreationImageThread3 = 1 And CreationImageThread4 = 1

Debug "Nombre d'image totale crée: " + Str(NombreImageTotaleCree)

ForEach StokageImage1()
  AddElement(StokageImage())
  StokageImage() = StokageImage1()
Next

ForEach StokageImage2()
  AddElement(StokageImage())
  StokageImage() = StokageImage2()
Next

ForEach StokageImage3()
  AddElement(StokageImage())
  StokageImage() = StokageImage3()
Next

ForEach StokageImage4()
  AddElement(StokageImage())
  StokageImage() = StokageImage4()
Next

ForEach NumeroImage1()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage1()
Next

ForEach NumeroImage2()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage2()
Next

ForEach NumeroImage3()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage3()
Next

ForEach NumeroImage4()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage4()
Next

;ImpressionImage(ImageX ,ImageY ,LargeurImage ,HauteurImage)

;EnregistrementImage()

; IDE Options = PureBasic 4.51 (Windows - x86)
; CursorPosition = 15
; Folding = --
; EnableXP
; EnableUser
; EnableOnError
; EnableCompileCount = 683
; EnableBuildCount = 0
; EnableExeConstant
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: tantative création programme

Message par bombseb »

Dayvid, je vais te donner un bon conseil si tu veux faire de la programmation :

Il faut que tu optimise la lecture de ton programme

ex :

Code : Tout sélectionner

ForEach StokageImage1()
  AddElement(StokageImage())
  StokageImage() = StokageImage1()
Next

ForEach StokageImage2()
  AddElement(StokageImage())
  StokageImage() = StokageImage2()
Next

ForEach StokageImage3()
  AddElement(StokageImage())
  StokageImage() = StokageImage3()
Next

ForEach StokageImage4()
  AddElement(StokageImage())
  StokageImage() = StokageImage4()
Next

ForEach NumeroImage1()
  AddElement(NumeroImage())
  NumeroImage() = NumeroImage1()
Next
quand je vois ces boucles je me dis qu'il y a un truc qui cloche dans ton programme
dans ce cas précis tu pourrais par exemple te créer une procédure qui prendrais un paramètre et faire ta boucle dedans, ensuite tu n'aurais qu'a l'appeller plutôt que de dupliquer ton code car ca nuis à la lisibilité de ton code


ca :

Code : Tout sélectionner

Global NewList StokageImage()
Global NewList StokageImage1()
Global NewList StokageImage2()
Global NewList StokageImage3()
Global NewList StokageImage4()
tu pourrais le remplacer par un tableau de listes (une ligne de code au lieu de cinq)


ca :

Code : Tout sélectionner

Global NewList NumeroImage()
Global NewList NumeroImage1()
Global NewList NumeroImage2()
Global NewList NumeroImage3()
Global NewList NumeroImage4()
tu pourrais le remplacer par un autre tableau de listes (une ligne de code au lieu de cinq)


ca :

Code : Tout sélectionner

Procedure CreationImageThread1(Thread1)
  t1 = ElapsedMilliseconds()
  For NumeroImageThread1 = 1 To NombreImage / 4
    If ImageRestante => NombreImage
      Break 
    EndIf
    WaitSemaphore(Semaphore)
    AddElement(StokageImage1())
    StokageImage1() = CreateImage(NumeroImageThread1, LargeurImage ,HauteurImage)
    AddElement(NumeroImage1())
    NumeroImage1() = NumeroImageThread1
    SignalSemaphore(Semaphore)
    Thread1 + 1
    ImageRestante + 1
  Next
  t2 = ElapsedMilliseconds()
  Debug "Le Thread 1 à mis " + Str(t2 - t1) + " Milisecondes pour crée " + Str(Thread1) + " Images"
  CreationImageThread1 = 1
  ComptabilisationImageCree(Thread1)
EndProcedure
tu a créé cinq procédures identiques à celle ci, il y a juste un indice qui change
pourquoi ne pas envoyer cet indice en paramètre et ne créer qu'une seule fois cette procédure ?

A quoi ca sert de faire ca ? Et bien si tu trouve un bug dans ta procédure là tu vas devoir le corriger cinq fois au lieu d'une seule fois avec ma méthode, la lisibilité de ton prog sera bien meilleure
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: tantative création programme

Message par blendman »

Bombseb : je suis d'accord avec toi, il faudrait vraiment optimiser tout ça et mieux l'organiser aussi je pense, car là, c'est assez illisible :).

Sinon, pour ceci :
ca :

Code : Tout sélectionner

Global NewList StokageImage()
Global NewList StokageImage1()
Global NewList StokageImage2()
Global NewList StokageImage3()
Global NewList StokageImage4()
tu pourrais le remplacer par un tableau de listes (une ligne de code au lieu de cinq)
comment crée-t'on un tableau de liste ?

merci.

EDIT :
j'ai essayé en faisant comme ceci :

Code : Tout sélectionner

Structure s_sprite
  x.i
  y.i
  id.i
EndStructure

Structure s_list
  name$
  List St.s_sprite()
EndStructure

Global Dim Listz.s_list(5)
Listz(1)\name$ = "sol"
AddElement(Listz(1)\St())
listz(1)\St()\id = 2

Listz(2)\name$ = "fleur"

For i = 1 To 2
  Debug Listz(i)\name$
  ForEach Listz(i)\St()
    Debug Listz(i)\St()\id
  Next  
Next i
J'imagine qu'il y a une autre méthode.
Dernière modification par blendman le lun. 08/août/2011 11:51, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: tantative création programme

Message par Ar-S »

Je pense qu'il veut parler d'un tableau à dimensions multiples genre

Code : Tout sélectionner

Dim Tableau.i(truc1,truc2,truc3)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: tantative création programme

Message par bombseb »

En fait je n'utilise jamais de listes.... je pensait qu'on pouvait faire facilement des tableaux de liste
sinon, utiliser des tableaux tout court
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: tantative création programme

Message par Backup »

bombseb a écrit :En fait je n'utilise jamais de listes.... je pensait qu'on pouvait faire facilement des tableaux de liste
sinon, utiliser des tableaux tout court

comme bien souvent, je pense que cela est due a une mauvaise utilisation
enfin, je veux dire une mauvaise "vue" de ce qu'est une liste, un tableau,etc ...

n'etant pas un specialiste des listes, mais j'ai apris ici meme a les utiliser, il y a quelques temps
je vais quand meme m'exprimer sur le sujet.

une liste a pour vocation de remplacer un tableau pour certaines utilisation

dans ce cas, a quoi servirai un tableau de liste ?... pour moi ça n'a pas d'utilité
c'est meme quelque part une incoherence que de vouloir le faire ...

une liste peut etre structuré , ce qui offre deja un super confort.

un tableau reste un tableau (là je connais nettement mieux)
on a en purebasic la possibilité de redimensionner, c'est deja énorme

un tableau stock des données (numerique/alpha numerique)
la raison d'etre d'un tableau c'est l'utilisation en multi-dimention

ont peut retrouver une valeur par une coordonée X,y , voir Z etc ...


une liste devrai etre vu comme une sorte de pile
sur lequel on pose les données ...
si tu veux utiliser une autre liste, tu t'en creer une autre

une liste est donc un tuyaux de données
a quoi servirai de stocker les tuyaux de données dans un tableau ?
puisque tu peux individuellement atteindre une valeur dans chaqu'un des tuyaux que tu veux..

les rassembler dans un tableau , n'apporterai rien d’intéressant ..

une pile (son contenu) pourrai etre transferé dans un tableau
un tableau (son contenu) pourrai etre transferé dans une pile

mais avoir un tableau de liste , ou une liste de tableaux .. franchement
je cherche l’intérêt ...

si ce n'es compliquer sérieusement ton programme ...

pour rappel une liste peut etre Structuré c'est deja super bien :)

je n'ai personnellement dans mes "petits" programme jamais été bloqué
ni par l'utilisation d'une pile , ni d'un tableau

si tu en viens a etre bloqué par quelque chose , c'est peut etre ta façon d'entrevoir le probleme
a resoudre , qu'il faut revoir ... ;)
Syntax.error
Messages : 8
Inscription : mer. 13/juil./2011 16:42

Re: tantative création programme

Message par Syntax.error »

Quid d'une liste flanquée d'une structure contenant une liste ? :P
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: tantative création programme

Message par Backup »

Syntax.error a écrit :Quid d'une liste flanquée d'une structure contenant une liste ? :P
certes , mais j'en cherche encore l’intérêt ....
a part compliquer un peut plus le listing ...

on arrive assez facilement a obtenir un tres bon resultat avec un nombre de liste predefinies ..
:)

le principe de base etant d'utiliser un emplacement memoire pour stocker de la données..

pourquoi faire simple , lorsqu'on peut compliquer ? ... ;)
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: tantative création programme

Message par dayvid »

Oki, merci a tous pour vos réponces :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: tantative création programme

Message par bombseb »

mais avoir un tableau de liste , ou une liste de tableaux .. franchement
je cherche l’intérêt ...

si ce n'es compliquer sérieusement ton programme ...
je ne suis pas du tout d'accord avec toi...

utiliser un tableau de listes serais utile dans ce ca précis justement
ca lui permettrais de simplifier énormément son code, ca lui ferais beaucoup de lignes en moins et donc ca améliorerais la lisibilité de son programme
il n'aurais qu'une seule fonction CreationImageThread, qu'une seule boucle foreach, et ca lui permettrais également de pouvoir paramétrer facilement le nombre de thread à utiliser dans son programme sans avoir à rajouter des fonctions pour rajouter des thread
Répondre