Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Закрытие приложения


Автор: nerezus 28.6.2006, 08:40
Код

private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            Application.Exit();
        }

нажимаю крестик, мессаджбокс появляется, форма закрввается, но приложение не останавливается.

в параллельном потоке запущен сервер, слушающий сокет.

Как убить приложение без лишних вопросов?


И еще: 
Код

private void onFormLoad(object sender, EventArgs e)
        {
            ThreadedTcpSrvr server = new ThreadedTcpSrvr(true);
        }
 почему нельзя вынести ThreadedTcpSrvr server; из метода и поместить его под
Код

 public partial class Form1 : Form
{

пишет, что нету такого класса.

А этот класс я подключил в виде отдельного файла. Когда он объявлен внутри метода - то все работает.


Дотнет 2. 

Автор: Prehistorik 28.6.2006, 09:25
Код

private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            Application.Exit();
            thread.Stop();
        }
 

Автор: Mad 28.6.2006, 09:39
nerezus, анимательно проверь соответсвия namespace
а лучше выложи полный код (все определения), а то по этим кусочкам можно только догадки строить

Добавлено @ 09:51 
Цитата(Prehistorik @  28.6.2006,  08:25 Найти цитируемый пост)
private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            Application.Exit();
            thread.Stop();
        }

немного не так (Thread.Stop такого просто нет smile )
Код

private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            thread.Abort();
            MessageBox.Show("Preved!");
            Application.Exit();
        }

неплохо еще былобы вставить проверку на текущие состояние (может она уже сама вывалилась smile ), иначе возможны Exception 

Автор: mr.DUDA 28.6.2006, 09:56
Приложение остаётся работать, пока есть хотя бы один поток. Если совсем лениво (или не получается), можно с пом. WinAPI грохнуть процесс - TerminateProcess. 

Автор: nerezus 28.6.2006, 11:17
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


namespace threads
{
 
    public partial class Form1 : Form
    {
        protected ThreadedTcpSrvr server;

        public Form1()
        {
            InitializeComponent();
        }

        private void onFormLoad(object sender, EventArgs e)
        {
            server = new ThreadedTcpSrvr(true);
        }

        private void onFormClosed(object sender, FormClosedEventArgs e)
        {
            MessageBox.Show("Preved!");
            server.stopServe();
            Application.Exit();
        }


    }
}



И вот это почти из книжки(добавил ThreadedTcpSrvr(bool newThread), startThreaded(), stopServe())
Код

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace threads
{
    class ThreadedTcpSrvr
    {
        private TcpListener client;
        private bool threaded;
        private Thread mainServer;

        public ThreadedTcpSrvr()
        {
            this.threaded = false;
            this.startServe();
        }

        public ThreadedTcpSrvr(bool newThread)
        {
            if (false == newThread)
            {
                this.threaded = false;
                this.startServe();
            }
            else
            {
                this.threaded = true;
                this.startThreaded();
            }
        }

        private void startThreaded()
        {
            mainServer = new Thread(new
                     ThreadStart(this.startServe));
            mainServer.Start();
        }

        private void startServe()
        {
            client = new TcpListener(9050);
            client.Start();
            Console.WriteLine("Waiting for clients...");
            while (true)
            {
                while (!client.Pending())
                {
                    Thread.Sleep(1000);
                }
                ConnectionThread newconnection = new ConnectionThread();
                newconnection.threadListener = this.client;
                Thread newthread = new Thread(new
                     ThreadStart(newconnection.HandleConnection));
                newthread.Start();
            }
        }

        public void stopServe()
        {
            client.Stop();
            if (this.threaded) this.mainServer.Abort();
        }
    }

    class ConnectionThread
    {
        public TcpListener threadListener;
        private static int connections = 0;
        public void HandleConnection()
        {
            int recv;
            byte[] data = new byte[1024];
            TcpClient client = threadListener.AcceptTcpClient();
            NetworkStream ns = client.GetStream();
            connections++;
            Console.WriteLine("New client accepted: {0} active connections",
                     connections);
            string welcome = "Welcome to my test server";
            data = Encoding.ASCII.GetBytes(welcome);
            ns.Write(data, 0, data.Length);
            while (true)
            {
                data = new byte[1024];
                recv = ns.Read(data, 0, data.Length);
                if (recv == 0)
                    break;

                ns.Write(data, 0, recv);
            }
            ns.Close();
            client.Close();
            connections--;
            Console.WriteLine("Client disconnected: {0} active connections",
                      connections);
        }
    }

}


пытаюсь собрать - оно рутается  
Код

Error    1    Inconsistent accessibility: field type 'threads.ThreadedTcpSrvr' is less accessible than field 'threads.Form1.server'    C:\Мои документы\Visual Studio 2005\Projects\threads\threads\Form1.cs    15    35    threads


смысл этого ругательства я не понял, хотя все слова по отдельности понятны... smile  

Автор: Mad 28.6.2006, 11:29
Цитата(nerezus @  28.6.2006,  10:17 Найти цитируемый пост)
Inconsistent accessibility: field type 'threads.ThreadedTcpSrvr' is less accessible than field 'threads.Form1.server'

у тебя переменная определена как protected а класс как private


Цитата(nerezus @  28.6.2006,  10:17 Найти цитируемый пост)
namespace threads
{
    class ThreadedTcpSrvr
    {

замени на 
Код
namespace threads
{
    public class ThreadedTcpSrvr
    {

или

Цитата(nerezus @  28.6.2006,  10:17 Найти цитируемый пост)
    public partial class Form1 : Form
    {
        protected ThreadedTcpSrvr server;

на
Код

   public partial class Form1 : Form
    {
        private ThreadedTcpSrvr server;
 

Автор: nerezus 28.6.2006, 11:47
спасибо, объявления класса как паблик решило проблему )

но вот эта штука:
Код

public void stopServe()
        {
            client.Stop();
            if (this.threaded) this.mainServer.Abort();
        }

вешает программу.
если убрать client.Stop();, то следующая строчка не дает результатов, хотя условие верно. Продолжает дальше принимать соединения. 

Автор: Mad 28.6.2006, 12:09
вопервых AcceptTcpClient надо вызывать в слушующем потоке, а не в отдельном
вовторых NetworkStream закрывать ненадо, только TcpClient
и наконец в третьих, еще надо сохранять указатели клиентские потоки, и при закрытии приложения, останавливать их тоже

вообще-то структура многопотокового сервера выглядет намного сложней smile 

Автор: nerezus 28.6.2006, 12:30
Блин, тут на форуме часто джаваскрипт не загружается и кнопок нету, в том числе и "Отправить".

Цитата

опервых AcceptTcpClient надо вызывать в слушующем потоке, а не в отдельном

многопоточность работает )

до этого написал на дотнете калькулятор и мейлсендер, потом забросил...

сейчас хотел поэксперементировать с потоками и сетью, но видать слишком сложно для меня )

кстати, нету готовых классов многопоточных серверов? может я зря мучаюсь?
Например как в питоне есть ThreadedTcpServer(или похожее название), и там надо только метод handle() добавить... 

Автор: Mad 28.6.2006, 13:14
Цитата(nerezus @  28.6.2006,  11:30 Найти цитируемый пост)
кстати, нету готовых классов многопоточных серверов

посмотри на www.codeproject.com, там точно было 

Автор: jfx 28.6.2006, 14:57
На codeproject я находил только очень примитивные сервера. Есть реализации нормально сервера в коммерческих компонентах, например IP*Works! от  /n software inc. http://www.nsoftware.com/products/component/ipdaemon.aspx

А я в таком случае просто посылаю всем потокам сигнал что нужно завершаться (просто устанавливаю глобальный булевый флаг). Потаму что не всегда полезно делать Abort, а так посылаю сигнал, потоки доделывают что нужно и завершаются. А в основном потоке после посылки сигнала жду завершения потоков и тогда закрываю приложение.  

Автор: arilou 28.6.2006, 16:19
А можно просто при создании потока выставить для него свойство IsBackground = true, и тогда этот поток будет грохнут автоматом при Application.Exit(). 

Автор: nerezus 29.6.2006, 12:59
Цитата

На codeproject я находил только очень примитивные сервера. 

А коммерческие понятно платные?  smile 

Значит опять не получилось дотнет поучить =( 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)