znowu te wątki...

  • Rejestracja: dni
  • Ostatnio: dni
0

Prosiłbym o pomoc ponieważ nie mam już siły z tym walczyć... masakra jakaś...

Kopiuj
private void button1_Click(object sender, System.EventArgs e)
{
	        Thread trd = new Thread(new ThreadStart(this.load_Costam));
                    trd.IsBackground = true;
                    trd.Start();
}
...
...
...

private void load_Costam()
        {
            try
            {
                OpenFileDialog open = new OpenFileDialog();
                ..........
                ..........
                ..........
                ..........
               if (open.ShowDialog() == DialogResult.OK)
                {
     
                }
                
            }
            catch (Exception e)
            {
                Console.Write("" + e.Message);

            }
        }

Niewiem jak obejść to żeby nie pojawiał się ten bląd...

Kopiuj
the Current thread must be set to single thread apartment (STA) mode before 
OLE calls can be made. Ensure that your Main function has STAThreadAttribute 
marked on it. This exception is only raised if a debugger is attached to the 
process

oczywiście przed main jest [MTAThread] czy jakoś tak..

  • Rejestracja: dni
  • Ostatnio: dni
0

This exception is only raised if a debugger is attached to the
process

Spróbuj odpalić z exeka :)

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

Skoro mówi ci, że musi być STAThread, a ty ustawiasz MTAThread to o co ci w końcu chodzi?

carck3r
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 68
0

W wątkach roboczych nie można używać kontrolek. Jeśli chcesz ich użyć, to zrób to za pomocą kontrolka.Invoke.

  • Rejestracja: dni
  • Ostatnio: dni
0
carck3r napisał(a)

W wątkach roboczych nie można używać kontrolek. Jeśli chcesz ich użyć, to zrób to za pomocą kontrolka.Invoke.

Nie ma takiej metody jak

Kopiuj
open.Invoke

  • Rejestracja: dni
  • Ostatnio: dni
0
Rev.pl napisał(a)

Skoro mówi ci, że musi być STAThread, a ty ustawiasz MTAThread to o co ci w końcu chodzi?

Jeżeli dobrze rozumiem STAThread -> wszystko się wykonuje w jednym wontku a jak ja chcę mieć kilka wątków to ustawiam MTAThread i wszystko mi działa tylko nie moge obejść tego OpenFileDialog w drugim wątku...

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie, źle rozumiesz. Ten atrybut opisuje wewnętrzny sposób komunikacji .NET Frameworka z obiektami COM. Windows Forms do działania wymaga STAThread. Właśnie m.in. do OpenFileDialog .NET Framework odwołuje się poprzez COM i dlatego występuje twój błąd. Nawet domyślnie Visual Studio dekoruje w ten sposób metodę, która odpala Windows Forms (jedną metodę, nie znaczy to, że nie będziesz mógł korzystać z innych, własnych wątków w całej aplikacji!).

mykhaylo
  • Rejestracja: dni
  • Ostatnio: dni
0
michal231 napisał(a)

Nie ma takiej metody jakopen.Invoke

Metodę Invoke możesz wywołać na przykład dla Form. Przykład:

Kopiuj
    public delegate void OpenFileDialogDelegate();

    public partial class TestForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        private void ButtonTestClick(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(Do));
            thread.IsBackground = true;
            thread.Start();
        }

        private void Do()
        {
            Invoke(new OpenFileDialogDelegate(delegate()
                {
                    OpenFileDialog fileDialog = new OpenFileDialog();
                    if (fileDialog.ShowDialog() == DialogResult.OK)
                    {
                        Text = fileDialog.FileName;
                    }
                }));
        }
    }
  • Rejestracja: dni
  • Ostatnio: dni
0
Rev.pl napisał(a)

Nie, źle rozumiesz. Ten atrybut opisuje wewnętrzny sposób komunikacji .NET Frameworka z obiektami COM. Windows Forms do działania wymaga STAThread. Właśnie m.in. do OpenFileDialog .NET Framework odwołuje się poprzez COM i dlatego występuje twój błąd. Nawet domyślnie Visual Studio dekoruje w ten sposób metodę, która odpala Windows Forms (jedną metodę, nie znaczy to, że nie będziesz mógł korzystać z innych, własnych wątków w całej aplikacji!).

Wielkie dzieki za cierpiliwość i dobitność, wielkie dzięki

  • Rejestracja: dni
  • Ostatnio: dni
0
mykhaylo napisał(a)
michal231 napisał(a)

Nie ma takiej metody jakopen.Invoke

Metodę Invoke możesz wywołać na przykład dla Form. Przykład:

public delegate void OpenFileDialogDelegate();

public partial class TestForm : Form
{
    public ChildForm()
    {
        InitializeComponent();
    }

    private void ButtonTestClick(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(Do));
        thread.IsBackground = true;
        thread.Start();
    }

    private void Do()
    {
        Invoke(new OpenFileDialogDelegate(delegate()
            {
                OpenFileDialog fileDialog = new OpenFileDialog();
                if (fileDialog.ShowDialog() == DialogResult.OK)
                {
                    Text = fileDialog.FileName;
                }
            }));
    }
}
Kopiuj


Error 1 The name 'Invoke' does not exist in the current context

Kopiuj
  • Rejestracja: dni
  • Ostatnio: dni
0

sorka nie doczytałem jednej linijki :) wielkie dzieki :) działą !!!!

Kopiuj
Metodę Invoke możesz wywołać na przykład dla Form. Przykład:
M8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 151
0

Witam

Znalazłem ten temat, który dotyczy się wątków, więc zadam tu pytanie związane z wątkami.

Tworzę banalnie prostą aplikację, jedna forma oraz jeden button, odpalam ją i w menedżerze zadań widzę że ma ona 4 wątki. Dlaczego framework rozbija tak prostą aplikację na wątki ?

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

Niczego nie rozbija, po prostu rezerwuje dla aplikacji wątki na zapas.

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

Pamiętaj, że w procesie musi być również załadowany CLR.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Nie wiem jak jest w .NET, ale np w takiej Javie Swing ma własny wątek (konkretnie EDT), a JavaFX ma nawet kilka wątków.

Generalnie jak odpalasz jakieś GUI to gdzieś musi być co najmniej jeden specjalny wątek, który zbiera zdarzenia i je rozsyła. (Edit: OK, dokładnie to nie musi, ale bez dodatkowego wątku ciężko jest coś mielić nie mrożąc GUI)

M8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 151
0
somekind napisał(a):

Niczego nie rozbija, po prostu rezerwuje dla aplikacji wątki na zapas.

Czyli rozumiem, że pisząc taką aplikację dopóki sam nie stworzę nowych wątków, wszystko będzie w jednym wątku i cała aplikacja będzie wykonywana tylko przez jeden rdzeń procesora ?

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

I tak i nie. Zależy co rozumiesz poprzez swoją aplikację. Cały proces, w którym działa twoja aplikacja to coś więcej, np. wspomniany przeze mnie CLR, GC i tak dalej. Jeżeli za swoją aplikację przyjmiesz kod napisany przez ciebie przy użyciu Windows Forms to tak domyślnie, będzie to tylko jeden główny wątek, w którym przetwarzane są systemowe komunikaty oraz twój kod.

NU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Może ktoś mi pomoc w podobnym problemie [C#] Watki i wywolanie metody z Form1 z watka ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.