problem z wyswietleniem

0

Witam,
problemik jest nastepujacy. Programik ma dzialac nastepujaco:

  1. dataGridView jest niewidoczny i czeka dopoki ktos nie wlozy karty do czytnika
  2. nastepuje wlozenie karty
  3. wyswietla sie dataGridView
  4. wyjmujemy karte, dataGridView znika i znowu cala operacja jest odpoczatku

[Kod C#]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Karta;
using System.Threading;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void przel()
{
while (!nowa.IsCardInserted())
{ }
dataGridView1.Visible = true;
while (nowa.IsCardInserted())
{ }
dataGridView1.Visible = false;

    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        while (1 == 1)
        {
            przel();
        }
    }
}

}
Problem jest taki: w ogóle nie wyswietla dataGridView, obojetnie czy jest karta czy jej tez nie ma. Natomiast jak wytne
while (nowa.IsCardInserted())
{ }
dataGridView1.Visible = false;

to mi zadziala... nie wiem dlaczego tak akurat sie dzieje:(

Czy ktos ma moze jakis pomysl?
Zgory dzieki ;)

0

czym jest obiekt nowa? Najwyrazniej nowa.IsCardInserted nie dziala tak jak sie spodziewasz...

PS. Nie wiem czy to ostateczny szablon, ale taki sposob sprawdzania zarzyna proca.

0

nowa jest obiektem klasy, ktora obsluguje czytnik.
Karta.Czytaj nowa = new Karta.Czytaj();

Dziala jak nalezy, sprawdzalem.

Podaj jak mozesz inny sposob sprawdzania, bede wdzieczny.:)
pozdrawiam

0

Najlepiej zaimplementuj w klasie Czytaj zdarzenia OnCardInserted i OnCardTakenOut i tylko podpinaj sie pod te zdarzenia. Do wywolania zdarzen uzyj watku, ktore co zadany czas (np. 100ms) sprawdzi czy stan obecnosci karty sie zmienil. W ten sposob po pierwsze nie zarzniesz procka (bo sprawdzanie jest tylko pare razy na sekunde, a nie tyle ile uda sie programowi do procka dorwac). Po drugie podpinasz tylko zdarzenia polegajace na odpowiedniej reakcji (czyli pokazaniu, badz zgaszeniu) i tyle. Jak bede mial chwile jutro to napisze przyklad, chyba, ze zdarzysz do tego czasu znalezc w necie (albo juz wiesz jak).

0

napisz jakbys mogl przykladowy kod
bede wdzieczny za wszelka pomoc, bo na razie jestem z tego zielony

0

Obiecany przyklad, powinno byc wszystko jasne


using System;
using System.Threading;

namespace test_console
{

class Card
{
    public Card()
    {
        if (CardTestingThread == null)
            (CardTestingThread = new Thread(new ThreadStart(TestCardStatus))).Start();
    }

    private static Thread CardTestingThread = null;

    protected bool IsInserted = false; 
    public bool ExternalInsertCardTest = false; //na potrzeby zaprezentowania metody IsCardInserted
    public bool CardTestingRunning = true;

    public event EventHandler CardInserted;

    public event EventHandler CardTakenOut;

    protected void FireCardInsertedEvent(object iSender, EventArgs iArgs)
    {
        if(CardInserted != null)
            CardInserted(iSender, iArgs);
    }

    protected void FireCardTakenOutEvent(object iSender, EventArgs iArgs)
    {
        if(CardTakenOut != null)
            CardTakenOut(iSender, iArgs);
    }

    protected bool IsCardInserted()
    {
        //tu w normalnym przypadku jakies operacje stwierdzajace, czy karta w srodku
        return ExternalInsertCardTest;
    }

    public void TestCardStatus()
    {
        while(CardTestingRunning)
        {
            if(IsInserted && !IsCardInserted())
            {
                IsInserted = false;
                FireCardTakenOutEvent(this, new EventArgs());
            }
            if(!IsInserted && IsCardInserted())
            {
                IsInserted = true;
                FireCardInsertedEvent(this, new EventArgs());
            }
            Thread.Sleep(100);
        }
    }

}

class MainClass
{
    public static void ReactOnCardInserted(object sender, EventArgs args)
    {
        Console.WriteLine("Karta została wsunięta");
    }

    public static void ReactOnCardTakenOut(object sender, EventArgs args)
    {
        Console.WriteLine("Karta została wyciągnięta");
    }

    public static void Main(string[] args)
    {
        Card NewCard = new Card();
        NewCard.ExternalInsertCardTest = true;
        Thread.Sleep(1000);
        NewCard.ExternalInsertCardTest = false;
        Thread.Sleep(1000);
        //nic sie nie stalo bo obsluga zdarzen nie zostala podpieta
        Console.WriteLine("Teraz z obsluga zdarzen");
        NewCard.CardInserted += ReactOnCardInserted;
        NewCard.CardTakenOut += ReactOnCardTakenOut;
        NewCard.ExternalInsertCardTest = true;
        Thread.Sleep(1000);
        NewCard.ExternalInsertCardTest = false;
        Thread.Sleep(1000);
        NewCard.CardTestingRunning = false;//wylaczenie watku sprawdzania 
        Console.WriteLine("Koniec");
        Console.Read();
    }
}

}

0

Dzieki wielkie za pomoc:)

0

//tu w normalnym przypadku jakies operacje stwierdzajace, czy karta w srodku

A konkretniej jak to stwierdzic ?

0

Ja to robię tak:

//pobieramy listę napędów
DriveInfo[] drives = DriveInfo.GetDrives();
//przeszukujemy tablicę napędów
foreach (DriveInfo d in drives)
{
if (d.DriveType == DriveType.Removable)
{
//mamy kartę
}
}

0

Dzieki tego szukalem

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