Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 19 дек 2018, 17:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Останавливается поток
СообщениеДобавлено: 28 окт 2014, 08:54 

Зарегистрирован: 08 фев 2014, 18:15
Сообщений: 134
Благодарил (а): 53 раз.
Поблагодарили: 7 раз.
Есть программа - раз в десять секунд читает буфер обмена, обрабатывает данные и выводит на экран. Так вот поток, который все это дело проворачивает почему то через 10-20 секунд работы самопроизвольно останавливается. Мне сказали, что такое может быть, когда компу не хватает ресурсов и винда сама уничтожает поток(моя программа работает в паре с другой очень ресурсоемкой программой). Как этого избежать?
Вот код:

Код: [ Загрузить ] [ Скрыть ]
  1. package com.mezmeraiz; 
  2.  
  3. import java.awt.Toolkit; 
  4. import java.awt.datatransfer.Clipboard; 
  5. import java.awt.datatransfer.DataFlavor; 
  6. import java.awt.datatransfer.Transferable; 
  7. import java.awt.datatransfer.UnsupportedFlavorException; 
  8. import java.io.File; 
  9. import java.io.IOException; 
  10. import java.nio.ByteBuffer; 
  11. import java.nio.ByteOrder; 
  12. import java.util.concurrent.TimeUnit; 
  13.  
  14. import org.eclipse.swt.widgets.Display; 
  15. import org.eclipse.swt.widgets.Shell; 
  16. import org.eclipse.swt.widgets.Button; 
  17. import org.eclipse.swt.SWT; 
  18. import org.eclipse.swt.widgets.Text; 
  19. import org.eclipse.swt.events.SelectionAdapter; 
  20. import org.eclipse.swt.events.SelectionEvent; 
  21.  
  22. public class WoT2 { 
  23.  
  24.     protected Shell shell; 
  25.     private Text text; 
  26.     private Text text_1; 
  27.     private Text text_2; 
  28.     private Text text_3; 
  29.     private Text text_4; 
  30.     private Text text_5; 
  31.     private Text text_6; 
  32.     private Text text_7; 
  33.     private Text text_8; 
  34.     private Text text_9; 
  35.     private Text text_10; 
  36.      
  37.     private float[]floatArray; 
  38.     private boolean state = true; 
  39.     private String s = "begin";     
  40.     private int len = 0; 
  41.     private int count = 0; 
  42.     private Thread thread; 
  43.      
  44.  
  45.     /** 
  46.      * Launch the application. 
  47.      * @param args 
  48.      */ 
  49.     public static void main(String[] args) { 
  50.         try { 
  51.             WoT2 window = new WoT2(); 
  52.             window.open(); 
  53.         } catch (Exception e) { 
  54.             e.printStackTrace(); 
  55.         } 
  56.     } 
  57.  
  58.     /** 
  59.      * Open the window. 
  60.      */ 
  61.     public void open() { 
  62.         Display display = Display.getDefault(); 
  63.         createContents(); 
  64.         shell.open(); 
  65.         shell.layout(); 
  66.         while (!shell.isDisposed()) { 
  67.             if (!display.readAndDispatch()) { 
  68.                 display.sleep(); 
  69.             } 
  70.         } 
  71.     } 
  72.  
  73.     /** 
  74.      * Create contents of the window. 
  75.      */ 
  76.     protected void createContents() { 
  77.         shell = new Shell(); 
  78.         shell.setSize(486, 300); 
  79.         shell.setText("SWT Application"); 
  80.          
  81.         Button btnStart = new Button(shell, SWT.NONE); 
  82.         btnStart.addSelectionListener(new SelectionAdapter() { 
  83.             @Override 
  84.             public void widgetSelected(SelectionEvent e) { 
  85.                 text_3.setText(""); 
  86.                 System.out.println("click"); 
  87.                 state = false; 
  88.                 if (thread!=null){                     
  89.                     thread.stop(); 
  90.                     thread = null; 
  91.                     } 
  92.                 state=true; 
  93.                 thread = new Thread(new myThread()); 
  94.                 thread.start(); 
  95.                  
  96.             } 
  97.         }); 
  98.         btnStart.setBounds(315, 84, 68, 23); 
  99.         btnStart.setText("Start"); 
  100.          
  101.         Button btnStop = new Button(shell, SWT.NONE); 
  102.         btnStop.addSelectionListener(new SelectionAdapter() { 
  103.             @Override 
  104.             public void widgetSelected(SelectionEvent e) { 
  105.                 state = false;     
  106.             } 
  107.         }); 
  108.         btnStop.setBounds(315, 121, 68, 23); 
  109.         btnStop.setText("Stop"); 
  110.          
  111.         text = new Text(shell, SWT.BORDER); 
  112.         text.setBounds(0, 61, 213, 19); 
  113.          
  114.         text_1 = new Text(shell, SWT.BORDER); 
  115.         text_1.setBounds(0, 86, 213, 19); 
  116.          
  117.         text_2 = new Text(shell, SWT.BORDER); 
  118.         text_2.setBounds(0, 112, 213, 19); 
  119.          
  120.         text_3 = new Text(shell, SWT.BORDER); 
  121.         text_3.setBounds(0, 137, 213, 19); 
  122.          
  123.         text_4 = new Text(shell, SWT.BORDER); 
  124.         text_4.setBounds(0, 162, 213, 19); 
  125.          
  126.         text_5 = new Text(shell, SWT.BORDER); 
  127.         text_5.setBounds(0, 10, 76, 19); 
  128.          
  129.         text_6 = new Text(shell, SWT.BORDER); 
  130.         text_6.setBounds(79, 10, 76, 19); 
  131.          
  132.         text_7 = new Text(shell, SWT.BORDER); 
  133.         text_7.setBounds(160, 10, 76, 19); 
  134.          
  135.         text_8 = new Text(shell, SWT.BORDER); 
  136.         text_8.setBounds(241, 10, 76, 19); 
  137.          
  138.         text_9 = new Text(shell, SWT.BORDER); 
  139.         text_9.setBounds(322, 10, 76, 19); 
  140.          
  141.         text_10 = new Text(shell, SWT.BORDER); 
  142.         text_10.setBounds(401, 10, 76, 19); 
  143.  
  144.     } 
  145.      
  146.     public class myThread implements Runnable{ 
  147.          
  148.          
  149.  
  150.         @Override 
  151.         public void run() { 
  152.             // TODO Auto-generated method stub 
  153.             while (state==true){ 
  154.                 try { 
  155.                     TimeUnit.MILLISECONDS.sleep(100); 
  156.                 } catch (InterruptedException e) { 
  157.                     // TODO Auto-generated catch block 
  158.                     e.printStackTrace(); 
  159.                 } 
  160.                 s = getClipboard(); 
  161.                 len = s.length(); 
  162.                 floatArray = stringToFloat(s); 
  163.                 count++; 
  164.                 if (floatArray!=null){ 
  165.                 Display.getDefault().asyncExec(new Runnable() { 
  166.                     public void run() { 
  167.                         text.setText(s); 
  168.                         text_1.setText(String.valueOf(len)); 
  169.                         text_2.setText(String.valueOf(count)); 
  170.                         text_5.setText(String.valueOf(floatArray[0])); 
  171.                         text_6.setText(String.valueOf(floatArray[1])); 
  172.                         text_7.setText(String.valueOf(floatArray[2])); 
  173.                         text_8.setText(String.valueOf(floatArray[3])); 
  174.                         text_9.setText(String.valueOf(floatArray[4])); 
  175.                         text_10.setText(String.valueOf(floatArray[5])); 
  176.                     } 
  177.                 }); 
  178.                 } 
  179.                  
  180.             } 
  181.              
  182.             Display.getDefault().asyncExec(new Runnable() { 
  183.                 public void run() { 
  184.                     text_3.setText("end");                     
  185.                 } 
  186.             }); 
  187.              
  188.              
  189.         } 
  190.          
  191.     } 
  192.      
  193.     public String  getClipboard() { 
  194.         String clipString = "begin"; 
  195.         Object content = new Object(); 
  196.         Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); 
  197.          
  198.         Transferable clipData = clip.getContents(content); 
  199.         try { 
  200.             clipString = (String)clipData.getTransferData(DataFlavor.stringFlavor); 
  201.         } catch (UnsupportedFlavorException e) { 
  202.             // TODO Auto-generated catch block 
  203.             e.printStackTrace(); 
  204.         } catch (IOException e) { 
  205.             // TODO Auto-generated catch block 
  206.             e.printStackTrace(); 
  207.         } 
  208.          
  209.         return clipString; 
  210.     } 
  211.      
  212.     public float[] stringToFloat(String s){ 
  213.         if (s==null | s.length()<26) 
  214.             return null;         
  215.          
  216.         byte[]xtr = s.getBytes(); 
  217.          
  218.         if (xtr[0]!=22) 
  219.             return null; 
  220.  
  221.         byte[]b1 = {xtr[5],xtr[4],xtr[3],xtr[2]}; 
  222.         byte[]b2 = {xtr[9],xtr[8],xtr[7],xtr[6]}; 
  223.         byte[]b3 = {xtr[13],xtr[12],xtr[11],xtr[10]}; 
  224.         byte[]b4 = {xtr[17],xtr[16],xtr[15],xtr[14]}; 
  225.         byte[]b5 = {xtr[21],xtr[20],xtr[19],xtr[18]}; 
  226.         byte[]b6 = {xtr[25],xtr[24],xtr[23],xtr[22]}; 
  227.          
  228.         float f1 = ByteBuffer.wrap(b1).order(ByteOrder.BIG_ENDIAN).getFloat(); 
  229.         float f2 = ByteBuffer.wrap(b2).order(ByteOrder.BIG_ENDIAN).getFloat(); 
  230.         float f3 = ByteBuffer.wrap(b3).order(ByteOrder.BIG_ENDIAN).getFloat(); 
  231.         float f4 = ByteBuffer.wrap(b4).order(ByteOrder.BIG_ENDIAN).getFloat(); 
  232.         float f5 = ByteBuffer.wrap(b5).order(ByteOrder.BIG_ENDIAN).getFloat(); 
  233.         float f6 = ByteBuffer.wrap(b6).order(ByteOrder.BIG_ENDIAN).getFloat(); 
  234.  
  235.         float[]ret = {f1,f2,f3,f4,f5,f6}; 
  236.  
  237.         return ret; 
  238.      
  239.     } 


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Останавливается поток
СообщениеДобавлено: 28 окт 2014, 08:59 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
нужно разделять поток Ui и исполняемый, нельзя из него менять UI, тогда не будет остановок.

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Останавливается поток
СообщениеДобавлено: 28 окт 2014, 10:01 

Зарегистрирован: 08 фев 2014, 18:15
Сообщений: 134
Благодарил (а): 53 раз.
Поблагодарили: 7 раз.
Foenix писал(а):
нужно разделять поток Ui и исполняемый, нельзя из него менять UI, тогда не будет остановок.

Я меняю UI через asyncExec. Он как раз и сделан для доступа к UI SWT из исполняемого потока. И все меняется нормально, UI успевает обновиться раз 100 и ничего не виснет. Просто через какое то время поток с циклом просто вырубается..


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB