Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 10 odgovora
  • 3.183 pregleda

Najnovija ↓

Zasto se ovo desava??? 05.08.2010. u 09:58 · pre 197 meseci
izmenjeno 1 put, poslednji put mmix 05.08.2010. u 10:09
  1. mmix05.08.2010. u 10:09zapis iz teksta poruke
#1
Imam ovu klasu:
Code (csharp):

     public class Semaphore
     {
          private Mutex[] m_mutex;
          private Thread[] m_threadIds;
          private int m_threadLimit;

          // constructor
          // parameter - threadLimit (number of threads to control)
          public Semaphore(int threadLimit)
          {
               m_threadLimit = threadLimit;
               m_mutex = new Mutex[m_threadLimit];
               m_threadIds = new Thread[m_threadLimit];
               for (int i=0; i<m_threadLimit; i++)
               {
                    m_mutex[i] = new Mutex();
                    m_threadIds[i] = null;
               }
          }

          // if there is a timeout then WaitHandle.WaitTimeout is returned
          // calling thread should check for this
          public int Wait()
          {
               int index = WaitHandle.WaitAny(m_mutex);
               if (index != WaitHandle.WaitTimeout)
                    m_threadIds[index] = Thread.CurrentThread;
               return index;
          }

          // release the mutex locked by the thread
          public void Release()
          {
               for (int i=0; i<m_threadLimit; i++)
               {
                    if (m_threadIds[i] == Thread.CurrentThread)
                    {
                         m_mutex[i].ReleaseMutex();
                    }
               }
          }

     }
 


i imam ovaj kod u MainForm:
Code (csharp):

        public const byte ENQ = 0x05;
        public static byte[] ENQ_BUFF = { ENQ };

        private void btnSend_Click(object sender, EventArgs e)
        {
            Thread s = new Thread(new ParameterizedThreadStart(SendX));
            s.Start(ENQ_BUFF);
        }

        private void SendX(object param)
        {
            m_semaphore.Wait();
            byte[] msg = (byte[])param;
            Send(msg);
            frmDataSend new_frmDataSend = new frmDataSend();
            new_frmDataSend.Show();
            m_semaphore.Release();
        }

        private void Send(byte[] msg)
        {
            //slanje podataka
        }
 


Moje pitanje je zasto se new_frmDataSend otvori i zatvori odmah? Meni je potrebno da dok god ja new_frmDataSend rucno ne ztvorim da se ona ne gasi. Ono sto je meni potrebno je ono sto se desava kada umesto
Code (csharp):

            frmDataSend new_frmDataSend = new frmDataSend();
            new_frmDataSend.Show();
 

stavim
Code (csharp):

            MessageBox.Show("WORK. JEEE!");
 

Kakava je razlika izmedju MessageBox koji se gasi na OK button i Form koja se gasi na OK button?
Re: Zasto se ovo desava??? 05.08.2010. u 10:05 · pre 197 meseci #3
Boze naivnosti...resenje je u tome da ukoliko stoji new_frmDataSend.Show() tada kod zatvara formu ali kada stoji new_frmDataSend.ShowDialog() to se ne desava. Eto sa ovim se patim 2h i nista nisam mogao da uradim dok nisam postavio pitanje :)
Nekada su neke stvari prosto inspirativne ;)
Re: Zasto se ovo desava??? 05.08.2010. u 10:11 · pre 197 meseci #5
Cisto iz kurioziteta, sta radis sa ovim programom. Onaj semaphor class mi deluje preterano zakomplikovan.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Zasto se ovo desava??? 05.08.2010. u 13:50 · pre 197 meseci #6
No problem mmix.
Pokusavam da omogucim da svaki put kada korisnik klikne da se podaci posalju on naredbu slanja prihvata bez obzira da li je predhodne podatke vec uspeo da posalje. Kada te prdhodne uspe da posalje onda prihvata sledece koji su dosli na red itd.
Nadam se da sam uspeo da objasnim?!
Re: Zasto se ovo desava??? 05.08.2010. u 14:16 · pre 197 meseci #7
Ok, asinhrono slanje sa redom, al sta ce ti mutex za svaki thread? Moze to i mnogo jednostavnije, jedan komunikacioni thread (kad vec moras da serijalizujes slanja) i mutex samo za komunikaciju sa tim threadom.

Isto mislim da imas potencijalno opasan problem sto dizes nove forme u threadovima, Winforms nije dizajniran da radi sa multithreaded operacijama, sve elemente treba generisati i odrzavati iz glavnog thread-a (zbog njegovog message queue-a)

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Zasto se ovo desava??? 06.08.2010. u 00:33 · pre 197 meseci #8
Imas prava sto se tice generisanja formi :( upravo sam dosao do tog problema, jer formu frmDataSend ne mogu da zatvorim nakon odredjenog dogadjaja. Prijavljuje se Cross-thread problem.
Na osnovu tvoje sugestije formu frmDataSend generisao sam u okviru glavnog threada i samo sam je pokreatao putem ShowDialog() u Thread s. Takodje, kada sam zeleo da pristupim formi kako bi je zatvorio to sam radio putem delegata, ali problem Cross-thread se i dalje ponovlja.
Postojili neka solucija...
Re: Zasto se ovo desava??? 06.08.2010. u 08:10 · pre 197 meseci #9
Sve što želiš da izmeniš u UI niti iz druge niti moraš da radiš pozivajući Invoke().

Na primer, ako tvoja forma ima neki string property koji želiš da promeniš, to radiš ovako:
Code:

private delegate void SetStringDelegate(string value);

private void SetStringProperty(string text)
        {
            if(InvokeRequired)
            {
                Invoke(new SetStringDelegate(SetStringProperty), new Object[] { text });
            }
            else
            {
                StringProperty = text;
            }
        }
Re: Zasto se ovo desava??? 06.08.2010. u 14:58 · pre 197 meseci #10
Da li postoji mogucnost da ja frmDataSend generisem na glavnom threadu, da je pokrecem na thread_1, a da je gasim u okviru eventa timer_tick?
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme