znowu te wątki...

0

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

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...

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..

0

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

Spróbuj odpalić z exeka :)

0

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

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.

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

open.Invoke

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...

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!).

0
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;
                    }
                }));
        }
    }
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

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;
                }
            }));
    }
}


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

0

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

Metodę Invoke możesz wywołać na przykład dla Form. Przykład:
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 ?

0

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

0

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

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)

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 ?

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1