vb.net 2005 Fehler beim erstellen des formulars (ActiveX Steuerelement kann nicht ...

SuperEbse

Grünschnabel
Hallo Community,

ich habe ein kleines Program geschrieben, welches Daten über eine Serielle Schnittstelle empfaengt und diese dann Verarbeitet. Versuche ich dann die Ausgelesen Daten auf einer Form anzuzeigen bekomme ich folgende Fehlermeldung

Fehler beim erstellen des formulars

Fehler:
Das ActiveX Steuerelement kann nicht instanziert werden, da der aktuelle Thread kein SingleThreadApartement ist

ich kann quasi über den Thread der Seriellen Schnittstelle ich denke mal das hier ein eigener Thread laeuft nicht auf die Form zugreifen.

Koennt Ihr mir da weiterhelfen

Ich kann auch auf kein ActiveX Control zugreifen was auf der Form eingebunden ist. selber fehler

Danke euch im voraus für Eure Hilfe

Gruss
SuperEbse
 
Hi & guten Morgen,

also das mit dem [STAThreadAttribute] habe ich schon mehrmals gelesen, nur habe ich das Problem dass ich nicht weiss wo ich das in vb.net setzen muss / kann / darf.

kann mir jemand mal vielleicht detailiert sagen, wie und wo ich das ändern muss?

EDIT: das einzigste was ich hierzu gefunden habe ist folgendes:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA)

Leider hat das aber auch keine Änderung gebracht, ich bin mir auch nich sicher wo ich das einbauen muss.
Gleich beim Laden der Form, oder bei dem Aufruf der jeweiligen SUB oder Function...

I´m frustrated ;-)

Danke vielmals an alle die mir hier weiterhelfen können!
Gruß
 
Zuletzt bearbeitet:
Also, STAThread ist ein Attribut, das man folgendermaßen verwendet:

Code:
    <STAThread()> _
    Sub Main()
    ...
    End Sub

Hier noch eine Info dazu:

STAThreadAttribute gibt an, dass das COM-Threadingmodell für die Anwendung Singlethread-Apartment ist. Dieses Attribut muss am Einstiegspunkt jeder Anwendung vorhanden sein, die Windows Forms verwendet. Wird es weggelassen, funktionieren die Windows-Komponenten eventuell nicht richtig. Wenn das Attribut nicht vorhanden ist, verwendet die Anwendung das Multithreaded-Apartmentmodell, das von Windows Forms nicht unterstützt wird.

Und der dazugehörige Link, nach 10 Sekunden Google gefunden:

http://msdn.microsoft.com/de-de/library/ms182351(vs.80).aspx
 
Zuletzt bearbeitet:
Guten Abend,

danke für den Tip, bin mir aber immer noch nich sich er ich das nun richtig hab....

Hier ein Code ausshnitt...

würde das so dann passen mit den Attributes?

Code:
Imports System.Threading
Public Class frm_main

    <STAThread()> _
    Public Shared Sub Main()
        Dim aform As New frm_main
        Application.Run(aform)
    End Sub


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


ich steh irgendwie immernoch auf dem Schlauch... auch wenn es funktioniert... verstehen würd ich es ja schon gerne ;-)

Gruß SuperEbse
 
Ja, das passt so.

Deine Anwendung bzw. die GUI läuft in einem Single-Thread. Das bedeutet, dass nichts gleichzeitig läuft, sondern alles eins nach dem anderen. Nun können innerhalb dieses Threads jedoch noch andere Threads abgespalten werden (dann wird es multi-threaded) und schlussendlich gibt es noch die ActiveX-Controls die man einbinden kann, die jedoch eine GUI (Oberfläche) verlangen, die in einem Single-Thread läuft. Dies erreichst du mit diesem Attribut (welches übrigens standardmäßig gesetzt werden müsste).
 
Hallo nochmal,

also wie gesagt ich habe das nun so eingebaut... dann sollte es doch auch funktionieren, dass der Thread welcher die Daten seriell empfangen hat, auch auf meine Form zugeifen kann oder? Leider ts immer noch nicht...




Da ich mit diesen STA Geschichten noch nie was mit zu tun hatte... eine doofe Frage.

Diese eingefügte ...

Code:
 <STAThread()> _
    Public Shared Sub Main()
        Dim aform As New frm_main
        Application.Run(aform)
    End Sub

Muss doch auch korrekt aufgerufen werden oder? Mein Prog, startet logischerweise mit dem FormLoad der frm_main. Ich Sub kann ich ja nich direkt aufrufen, das wäre ja in der konstellation eine Endlosschleife, und wenn ich den Application.Run Teil rausnehme würde ja der Thread nachwievor wie gewohnt ohne die korrekten attribute laufen oder?

Ich kann die Sub Main nur aufrufen, wenn ich in den Projekt Eigenschaften das Program als Konsolenanwenung kennzeichne... nur kann ich dann in meinen Modulen, dementsprechend nicht auf meine frm_main zugreifen...

Ich fange langsam an an mir zu zweifeln :-( naja nich wirklich.

Ich poste hier nochmal ein paar Code ausschnitte (welche mir die Probleme verursachen:


Code:
  Private Sub serial_scanner_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serial_scanner.DataReceived
        Try


            Dim strdata = Me.serial_scanner.ReadLine


            strdata = Replace(strdata, Chr(2), "")
            strdata = Replace(strdata, Chr(3), "")
            strdata = Replace(strdata, Chr(13), "")
            strdata = Replace(strdata, Chr(24), "")

'die später gefundenen Daten werden an get_item_details übergeben!
          Call analyze_scanned_headrest(strdata)


        Catch ex As Exception

        End Try
    End Sub



 Public Sub get_item_details(ByVal artikel As String, ByVal rod As String)

        Try

            Application.DoEvents()


            If File.Exists(Picture_path & artikel & Picture_extension) = True Then
               
                frm_main.pic_item.Load(Picture_path & artikel & Picture_extension)
                frm_main.pic_item.Visible = True
            End If

            frm_main.lbl_referenz.Text = artikel
         catch ex as exception
end try
...


Vielen Dank Für Eure HILFE

Gruss
 
Zuletzt bearbeitet:
Zurück