Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 22.09.2010, 00:07   #1
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию Поток. Не получается создать поток. Выдает ошибки при запуске

Всем доброе время суток!
Не получается создать нормально поток. Выдает ошибки после запуска уже скомпилированной программы. В чем проблема?

Вот сам код:
Код:
import java.awt.*;
 
class potoc implements Runnable
 
{  int a;
  JniTest jt; JniTest1 jt1; JniTest2 jt2; JniTest3 jt3;
  JniTest4 jt4; JniTest5 jt5; JniTest6 jt6; JniTest7 jt7;
  Thread qw;
  TextField t1=new TextField(),
            t2=new TextField(),
        t3=new TextField(),
            t4=new TextField(),
            t5=new TextField(),
            t6=new TextField(),
            t7=new TextField(),
        t8=new TextField();
 
   public potoc()
   {
         qw=new Thread(this);
   }
 
  public void run()
  {                    
 
         a=(int)(jt.showString(" "));                     
         t1.setText(String.valueOf(a));
         jt1 = new JniTest1();
         a=(int)(jt1.showString(" "));                     
         t2.setText(String.valueOf(a));
         jt2 = new JniTest2();
         a=(int)(jt2.showString(" "));                     
         t3.setText(String.valueOf(a));
         jt3 = new JniTest3();
         a=(int)(jt3.showString(" "));                     
         t4.setText(String.valueOf(a));
         jt4 = new JniTest4();
         a=(int)(jt4.showString(" "));                     
         t5.setText(String.valueOf(a));
         jt5 = new JniTest5();
         a=(int)(jt5.showString(" "));                     
         t6.setText(String.valueOf(a));
         jt6 = new JniTest6();
         a=(int)(jt6.showString(" "));                     
         t7.setText(String.valueOf(a));
         jt7 = new JniTest7();
         a=(int)(jt7.showString(" "));                     
         t8.setText(String.valueOf(a));
 
  }
}
 
public class ShowJniTest extends Dialog
{
  potoc Ot1;   
  Label l1=new Label("Процент оперативной памяти в использовании:"),
        l2=new Label("Полных Килобайтов физической памяти:"),
    l3=new Label("Свободных Килобайтов физической памяти:"),
        l4=new Label("Полных Килобайтов файла подкачки:"),
    l5=new Label("Свободных Килобайтов файла подкачки:"),
        l6=new Label("Полных Килобайта виртуальной памяти:"),
    l7=new Label("Свободных Килобайтов виртуальной памяти:"),
        l8=new Label("Cвободных Килобайтов расширенной памяти:");
 
      TextField t1=new TextField(),
            t2=new TextField(),
        t3=new TextField(),
            t4=new TextField(),
            t5=new TextField(),
            t6=new TextField(),
            t7=new TextField(),
        t8=new TextField();
 
  public ShowJniTest(Frame f, String str)
  {
      super(f, str);
      setSize(500, 300);
      setVisible(true);
      setLayout(null);
      l1.setBounds(10, 40, 290, 20);
      l2.setBounds(10, 70, 280, 20);
      l3.setBounds(10, 100, 280, 20);
      l4.setBounds(10, 130, 280, 20);
      l5.setBounds(10, 160, 280, 20);
      l6.setBounds(10, 190, 280, 20);
      l7.setBounds(10, 220, 280, 20);
      l8.setBounds(10, 250, 280, 20);
      add(l1); add(l2); add(l3); add(l4); add(l5); add(l6); add(l7); add(l8);
      t1.setBounds(300, 40, 170, 20);
      t2.setBounds(300, 70, 170, 20);
      t3.setBounds(300, 100, 170, 20);
      t4.setBounds(300, 130, 170, 20);
      t5.setBounds(300, 160, 170, 20);
      t6.setBounds(300, 190, 170, 20);
      t7.setBounds(300, 220, 170, 20);
      t8.setBounds(300, 250, 170, 20);
      add(t1); add(t2); add(t3); add(t4); add(t5); add(t6); add(t7); add(t8);
      Ot1=new potoc();  
      Ot1.qw.start();
  }
 
 
  public boolean handleEvent(Event e)
  {                     
     switch(e.id)
     {
         case Event.WINDOW_DESTROY:
           dispose();
           System.exit(0);
           return true;
     }
     return super.handleEvent(e);
  }
 
 
  public static void main(String[] args)
  {
      ShowJniTest F=new ShowJniTest(new Frame(), "Память");
 
  }
}
Вот ошибки при запуске самой программы
Код:
C:\Master_Java\Memory3>"C:\Program Files\Java\jdkl.6.0_12\bin\java.exe"  
ShowJniTest Exception in thread "Thread-3"  java.lang.NullPointerException
at potoc.run(ShowJniTest.Java:27)
at Java.lang.Thread.run(Thread.Java:619)
bigory вне форума Ответить с цитированием
Старый 22.09.2010, 03:31   #2
alexinspir
Новичок
Джуниор
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Нигде нет инициализации следующих переменных:
Код:
JniTest jt; JniTest1 jt1; JniTest2 jt2; JniTest3 jt3;
  JniTest4 jt4; JniTest5 jt5; JniTest6 jt6; JniTest7 jt7;
[B]ромик0:[/B] Cколько получают здешние модераторы?
[B]pu4koff:[/B] У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 22.09.2010, 17:55   #3
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию

Ошибку устранил, просто забыл прописать jt = new JniTest(); перед тем местом, где указывалось обращение по нулевому адресу.
JniTest(), это библиотека JniTest.dll написанная на языке си++. Их у меня несколько. Они возвращают значение int

Вот его код
Код:
#include <stdio.h>
#include "JniTest.h"
#include <windows.h>
#define DIV 1024
#define WIDTH 7

JNIEXPORT jint JNICALL Java_JniTest_showString(JNIEnv * jenv, jobject jobj, jstring message)
{
 const char *string = jenv->GetStringUTFChars(message, 0);
 MEMORYSTATUSEX statex;
      statex.dwLength = sizeof (statex);
      GlobalMemoryStatusEx (&statex);
 jenv->ReleaseStringUTFChars(message, string);

 return statex.dwMemoryLoad;;
Отличаются они все именно выходными параметрами. Здесь у меня все нормально, вопросов по ним нет.

Сейчас есть проблема передачи значения а в поля ввода t1.setText(String.valueOf(a));
Я по коду понимаю что t1 в потоке и t1 в основной программе, это разные значения. Вопрос теперь состоит в том, как мне переменную а передать в основной поток. Что мне надо прописать?
bigory вне форума Ответить с цитированием
Старый 23.09.2010, 00:40   #4
bigory
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 46
По умолчанию

Все, спасибо, вопрос снят
bigory вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически создать поток Человек_Борща Общие вопросы Delphi 6 26.08.2010 13:11
Как создать поток record222 Помощь студентам 1 07.04.2010 01:09
файловый поток. Открыть\создать бинарник Darth.Vader Общие вопросы C/C++ 16 29.12.2009 23:04
Создать отдельный поток для отправки письма betirsolt Работа с сетью в Delphi 2 28.12.2009 23:39
Как в VS 2008 создать поток? MaxDDT Общие вопросы C/C++ 0 11.12.2009 22:53