06.12.2006 16:59:07JCP - зависает генератор случайных чисел Ответов: 6
Иван
есть тестовое приложение.
два класса Main (основной класс) и NewJFrame (для графического UI). При вызове функции генерации из класса Main - все нормально, генерится. При вызове функции генерации из класса NewJFrame - зависает генератор на Инициализации ДСЧ.
В чем может быть трабл?
 
Ответы:
07.12.2006 18:08:00Иван
При любом использовании графических форм зависает Биологический ДСЧ.
08.12.2006 11:54:33Иван
так все-таки, в чем может быть проблема?
08.12.2006 14:00:10Иван
Обратит кто-нибудь внимание на этот пост?!!
11.12.2006 17:37:52bor1
Попробуйте создавать ключи не в обработчиках событий. Код, в котором ключи создает отдельная нитка, ожидающая выполнения условия, а условие создается в обработчике нажатия графической кнопки, работает.
15.12.2006 14:30:29Иван
Есть ли возвожность привести пример кода?
19.12.2006 16:08:10bor1
/*
* класс создает одну нитку, в которой будет сделан ключ по нажатию кнопки.
*/
public class BioFrameTest implements PageInterface {

... переменные, описывающие создаваемую панель.


/*кнопка, по нажатию которой создается ключ*/
private JButton randGen;

/*нитка создания ключей*/
private Thread mutThread;

/*объект для синхронизации */
private final Object object = new Object();

/*признак остановки*/
boolean whenstop = false;

/*
класс нитки
*/
private class Startkey implements Runnable {

boolean fin = false;

public void run() {
/*висим в цикле*/
while (!fin) {
/*проверяем, не попросили ли нас сделать ключ, под синхронизацией*/
synchronized (object) {
if (whenstop) {
try {
Provider p = Security.getProvider("JCP");
KeyPairGenerator keyGen =
KeyPairGenerator.getInstance(JCP.GOST_DEGREE_NAME, p);
KeyPair pair = keyGen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
fin = true;
}
}
}
}
}


/**
* Конструктор закладки контрольной панели.
*/
public BioFrameTest() {
.... - создание окна с кнопкой randGen.

/*создаем и запускаем нитку*/
mutThread = new Thread(new Startkey());
mutThread.start();

/*вешаем обработчик на кнопку, просящий создать ключ, но
самостоятельно ключ не создающий*/
randGen.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
synchronized (object) {
/*по этой переменной создастся ключ*/
whenstop = true;
}
}
});
}

/**
* Тест на страницу контрольной панели.
*
* @param args не используется
*/
public static void main(String[] args) {
final BioFrameTest tst = new BioFrameTest();
MainControlPane.start(tst);
}

}