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