Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252

    [VB2010 winform] ContextSwitchDeadlock è stata rilevata

    ContextSwitchDeadlock è stata rilevata
    Message: Impossibile eseguire la transizione dal contesto COM 0x4fe948 al contesto COM 0x4feab8 per 60 secondi. Probabilmente il thread a cui appartiene il contesto/apartment di destinazione è impegnato nell'attesa senza distribuzione o nell'elaborazione di un'operazione a esecuzione prolungata che non prevede la distribuzione di messaggi Windows. Questa situazione in genere ha un impatto negativo sulle prestazioni e può causare una mancata risposta dall'applicazione o un accumulo continuato nel tempo dell'utilizzo della memoria. Per evitare questo problema, è necessario che durante le operazioni a esecuzione prolungata tutti i thread in modalità STA (Single Thread Apartment) utilizzino primitive di attesa con distribuzione (ad esempio CoWaitForMultipleHandles) e messaggi distribuiti in base a routine.


    durante la creazione di button , impiego anche 3 minuti per rilevare tutte le posizioni, le dimensioni, etc, degli stessi, da variabili, e per posizionarli!!!

    Rimedio????

  2. #2
    Mi sembra impossibile aiutarti senza vedere un po' di codice (e capire qualcosa di più).
    Chi non cerca trova.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252
    scusa ...hai ragione in realtà è che penso solo che ci sei te che rispondi e non gli altri

    Questo è il codice che crea i button . da un altro routine gli arriva il numero da creare
    diciamo che stiamo tra gli 800 e i 2000 button

    codice:
    Public Sub recupera()
    'QUI TI HO MESSO SOLO LA PARTE DEL RECUPERO LINEA , ESTRAZIONE VALORI E PASSAGGIO ALLA CREAZIONE DEI PULSANTI.
    
    FrmChart.Panel1.SuspendLayout()
                Do While linea < VarCount
                    If FrmChart.TxtOpenChart.Items(linea) = "}" Then
                        Exit Do
                    End If
    
                    If FrmChart.TxtOpenChart.Items(linea) = "}" Or FrmChart.TxtOpenChart.Items(linea) = "{" Or FrmChart.TxtOpenChart.Items(linea) = "[ExpertSingle]" Then
                        FrmChart.TxtExpertSong.Text += FrmChart.TxtOpenChart.Items(linea) & vbCrLf
                        linea += 1
                    Else
                        AllText = FrmChart.TxtOpenChart.Items(linea)
                        AllTextArray = AllText.Split(" ")
                        InsPos = AllTextArray(0)
                        Uguale = AllTextArray(1)
                        Simbolo = AllTextArray(2)
                        Colore = AllTextArray(3)
                        Lung = AllTextArray(4)
    
                        InsNota = InsPos & " = " & Simbolo & " " & Colore & " " & Lung & vbCrLf
                        FrmChart.TxtExpertSong.Text += FrmChart.TxtOpenChart.Items(linea) & vbCrLf
    
    
                        CreaTastiV()
                        linea += 1
                    End If
    
                Loop
                FrmChart.Panel1.ResumeLayout()
    End Sub
    
    '***********************************************************
     Public Sub CreaTastiV()
    
            Posx = InsPos - FrmChart.NoteBox.HorizontalScroll.Value
                
    
            Dim V As New Button
    
    
            Select Case Colore
                Case 0
                    Posy = 15
                    If Simbolo = "S" Then
                        V.BackColor = Color.Aquamarine
                    Else
                        V.BackColor = Color.GreenYellow 'colore
                    End If
                Case 1
                    Posy = 65
                    If Simbolo = "S" Then
                        V.BackColor = Color.Aquamarine
                    Else
                        V.BackColor = Color.Red  'colore
                    End If
                Case 2
                    Posy = 115
                    If Simbolo = "S" Then
                        V.BackColor = Color.Aquamarine
                    Else
                        V.BackColor = Color.Yellow  'colore
                    End If
                Case 3
                    Posy = 165
                    If Simbolo = "S" Then
                        V.BackColor = Color.Aquamarine
                    Else
                        V.BackColor = Color.Blue  'colore
                    End If
                Case 4
                    Posy = 215
                    If Simbolo = "S" Then
                        V.BackColor = Color.Aquamarine
                    Else
                        V.BackColor = Color.Orange  'colore
                    End If
    
            End Select
    
      
           
            V.Location = New Point(Posx, Posy) 'posizione pulsante
            
            V.Size = New Size(PosLung, 40) 'grandezza pulsante
            V.Name = "Pulsante" & Nome.ToString 'nome pulsante
            V.Text = "" 'testo pulsante
    
            V.FlatStyle = FlatStyle.Flat
            V.Tag = InsNota 'inserisce nel tag il valore completo della nota
    
    
             FrmChart.NoteBox.Controls.Add(V) 'aggiunge
    
    
    
            AddHandler V.Click, AddressOf Pulsante_Click 'assegna click 
            AddHandler V.MouseHover, AddressOf Pulsante_MouseHover
            AddHandler V.MouseLeave, AddressOf Pulsante_Leave
    
            Nome += 1 'incrementa numero pulsante


    Impiega 10 secondi ad estrarre i dati dal file e poi 2,30 minuti per posizionari i vari button letti dalla "list" "txtopenchart"

  4. #4
    Hai provato togliendo SuspendLayout e ResumeLayout ?
    Chi non cerca trova.

  5. #5
    Al di la degli errori evidenziati, come ti avevo già detto in un PM, lo stile di programmazione non è proprio adatto al tipo di progetto che vorresti realizzare tu. Creare migliaia di button all'interno di un panel per conservare le note non mi sembra una buona idea, sia perché metti sotto stress inutilmente il pc, sia perché come hai già avuto il "piacere" di sperimentare il panel presenta qualche problema raggiunta una certa larghezza.

    Che senso ha creare tutti quei Button quando in pratica l'utilizzatore ne vede solo una piccola porzione? Per farti un esempio chiarificatore pensa ad un foglio di Excel: ci sono 256 colonne e 65536 righe, per un totale di oltre 16 milioni di celle. A video però vedi 20 colonne e 40 righe (dipende dalla dimensione della finestra), per un totale di 800 celle. Ebbene, Excel non carica nel suo "panel" tutte le 16 milioni di celle e relativi valori, ma solamente quelle che effettivamente deve mostrare a video. Ogni volta che l'utente muove la barra di scorrimento Excel ridisegna al max altre 800 colonne, senza conservare nella memoria video quelle esterne all'area di visualizzazione.

    Nel tuo caso io farei così:
    • importo le note in un array o in una lista
    • creo un panel senza barra di scorrimento
    • creo al di sotto del panel una barra di scorrimento orizzontale, impostando opportunamente le sue proprietà in base al numero di note caricate nell'array e alla posizione corrente visualizzata
    • aggiungo al panel solo i pulsanti relativi al contesto da visualizzare, svuotandolo ogni volta che devo ridisegnare le note

    Un sistema ancora più elegante e di migliore impatto grafico sarebbe quello di usare al posto del panel un usercontrol, dove al posto di aggiungere i Button disegna il "rigo" e le note attraverso il l'evento Paint...
    Chi non cerca trova.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252
    in realtà io già salvo le note in una lista e non direttamente nei pulsanti,
    però poi avrei voluto avere uno scorrimento totale di tutte le note, perchè tramite i pulsanti posso cambiare delle informazioni cliccandoci sopra.
    tipo il colore della nota (che sono 5) o agiungere lo starpower (che è una specie di bonus punti). alla singola nota.
    Ora che mi ci fai pensare però potrei far visualizzare solo alcune note per ogni scorrimento.

    Per ora in effetti ho risolto la lunghezza dividendo le note totali in 5 panel differenti.
    ma il tempo di caricamento ovviamente non cambia.


    Il suspendlayout l'ho tolto e non cambia niente (ci avevo pensato che poteva essere quello).

    Ora farò come dici te, caricare una parte per volta ...

    grazie.


    Ma quelle 2 routine che ho postato nn potresti scrivermele nel modo giusto fer farmi capire come devo cambiare il metodo di scrittura????

    secondo me non riesco a schiodarmi dal vb6.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    252
    allora ti aggiorno...

    non era la creazione dei button che mi aumentava il tempo della procedura
    ma il trascrivere direttamente l'elenco delle note da una lista ad una textbox
    senza passare per una variabile.
    ora ci metto 45 secondi .. e con altre 3 modifiche ne posso scalare altri 20 circa.

    cmq il problema di scrittura rimane.....

    ... fammi da guru!!!!


    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 © 2026 vBulletin Solutions, Inc. All rights reserved.