Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB] Problema di sincronizzazione

    Salve,

    ultimamente mi sto imbattendo in un problema che non riesco a risolvere, praticamente il codice che ho scritto prosegue senza attendere che gli algoritmi precedenti siano completi e sono costretto ad inserire la funzione "Threading.Thread.Sleep(Millisecondi)" dopo quasi ogni riga di codice in modo da farlo funzionare correttamente.
    Non sono molto esperto, ma so che ci sono funzioni che una volta chiamate creano un altro thread e il codice continua ad avanzare senza attendere che quelle funzioni vengano terminate.
    Le mie domande sono:
    - c'è qualche modo per forzare il codice a procedere solo sequenzialmente senza creare thread multipli?
    - come faccio a riconoscere se una funzione una volta eseguita attenderà il suo completamento prima di proseguire?

    Scusate se non sto postando il codice, ma si creerebbe solo più confusione.

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Invece bisogna capire a quale codice fai riferimento perché normalmente l'esecuzione è sequenziale ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    La logica di questo codice è corretta, infatti se inserisco delle pause (Threading.Thread.Sleep(Millisecondi)) il codice funziona perfettamente. Ho notato che questo codice funziona meglio su CPU più veloci, mentre sono costretto ad aumentare lo "Sleep" su CPU più lente (in questa parte di codice ho rimosso tutte le pause, ma fate finta che ce ne sia una subito dopo ogni chiamata ad una funzione esterna).

    Un esempio è dato da questa funzione "RossoNero":


    Private Sub RossoNero()

    Dim lColor As Integer
    Dim Limite As Integer = 1
    Dim Vincita As Double = 0
    Dim Raddoppi As Integer = 1
    Dim Giri As Integer = 0

    Do While (Vincita > -70 And Vincita < 100)
    Raddoppia(Raddoppi, Giocata)
    SpostaMouse("GiroVeloce")
    Clicca()
    AttendiFineGiocata()

    If Giocata = 0 Then
    lColor = GetPixel(GetDC(0), txtRossoX.Text, txtRossoY.Text)
    If lColor.ToString <> clrR.Text.ToString Then
    Resetta()
    Vincita = Vincita + Soldi(Raddoppi)
    Raddoppi = 1
    Else
    Vincita = Vincita - Soldi(Raddoppi)
    Raddoppi = Raddoppi + 1
    End If
    Else
    lColor = GetPixel(GetDC(0), txtNeroX.Text, txtNeroY.Text)
    If lColor.ToString <> clrN.Text.ToString Then
    Resetta()
    Vincita = Vincita + Soldi(Raddoppi)
    Raddoppi = 1
    Else
    Vincita = Vincita - Soldi(Raddoppi)
    Raddoppi = Raddoppi + 1
    End If
    End If

    CambiaGiocata()

    If Raddoppi > 9 Then
    SpostaMouse("X")
    Clicca()
    Exit Sub
    End If

    Giri = Giri + 1
    Loop

    End Sub

    **************************
    Le funzioni che chiama sono queste:

    Private Sub SpostaMouse(ByVal Locazione As String)

    Select Case Locazione
    Case "GiroVeloce"
    SetCursorPos(txtGiroVeloceX.Text, txtGiroVeloceY.Text)
    Case "Annulla"
    SetCursorPos(txtAnnullaX.Text, txtAnnullaY.Text)
    Case "X"
    SetCursorPos(txtXX.Text, txtXY.Text)
    Case "Rosso"
    SetCursorPos(txtRossoX.Text, txtRossoY.Text)
    Case "Nero"
    SetCursorPos(txtNeroX.Text, txtNeroY.Text)

    ... Altro codice simile ...

    End Select

    End Sub

    ***********

    Private Sub Clicca()

    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 1)
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 1)

    End Sub

    ***********

    Private Sub AttendiFineGiocata()

    Dim lColor As Integer = GetPixel(GetDC(0), txtENDX.Text, txtENDY.Text)
    Do While lColor.ToString = clrE.Text
    lColor = GetPixel(GetDC(0), txtENDX.Text, txtENDY.Text)
    Loop

    End Sub

    ***********

    Private Sub Resetta()

    Cicli = 1
    SpostaMouse("Annulla")
    Attendi(200)
    Clicca()

    End Sub

    ***********

    Private Sub CambiaGiocata()

    If Giocata = 0 Then
    Giocata = 1
    Else
    Giocata = 0
    End If

    End Sub

    ***********

    Private Sub Raddoppia(ByVal Raddoppi As Integer, ByVal Colore As Integer)

    Dim X As Integer = 0
    If Giocata = 0 Then
    SpostaMouse("Rosso")
    Else
    SpostaMouse("Nero")
    End If
    Select Case Raddoppi
    Case 1
    Clicca()
    Case 2
    Clicca()
    Clicca()
    Case 3

    ... Codice simile ...

    Case 6
    For X = 1 To 2
    Clicca()
    Next
    SpostaMouse("Fish3")
    Clicca()
    If Colore = 0 Then
    SpostaMouse("Rosso")
    Else
    SpostaMouse("Nero")
    End If
    For X = 1 To 3
    Clicca()
    Next
    SpostaMouse("Fish1")
    Clicca()

    End Select

    End Sub

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In pratica, le funzionalità a cui ti riferisci sono quelle di spostamento e click del mouse?


    P.S. Utilizza i tag CODE per il codice altrimenti si fa fatica a comprendere ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Non sono riuscito a intentare il codice con il tag CODE...
    Comunque, sono le funzioni Clicca(), SpostaMouse(), AttendiFineGiocata(), Resetta() che a loro volta hanno altre chiamate annidate.

    Per esempio, per una corretta esecuzione sono costretto a scrivere:

    SpostaMouse("GiroVeloce")
    Threading.Thread.Sleep(200)
    Clicca()
    Threading.Thread.Sleep(200)
    AttendiFineGiocata()
    Threading.Thread.Sleep(400)

    anziché

    SpostaMouse("GiroVeloce")
    Clicca()
    AttendiFineGiocata()

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nel caso delle simulazioni delle azioni del mouse (e della tastiera), introdurre dei ritardi è normale.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ok, farò alcuni test fin quando trovo esattamente quali sono le funzioni che mi creano questo disturbo.
    Grazie

  8. #8
    Infatti, ho inserito delle pause nelle funzioni che riguardavano lo spostamento ed il click del mouse ed adesso funziona perfettamente.
    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.