Articles of multithreading

Android:线程没有并行运行

我正在用Android / OpenGL编写游戏,并试图将我的OpenGL(渲染)逻辑与我的游戏更新逻辑分开,方法是在自己的线程上运行每个逻辑以提高性能。 我设法让每个都在自己的线程上运行,但是根据DDMS中的Tracer,线程仍在顺序运行(世界是我的游戏更新线程): 看到url,因为我没有图像权限: http : //img849.imageshack.us/img849/9688/capturegff.png 线程似乎不会同时执行代码。 我初始化世界线程如下: public class World implements Runnable { Thread thread; public World(…) { … // Initialise the player/ball objects initialiseObjects(); thread = new Thread(this, “World”); thread.start(); } } 我在两个线程之间实现了自己的同步。 使用类似于Replica Island的方法,我有两个渲染缓冲区:当渲染线程正在读取另一个缓冲区时,更新线程(理想情况下应该)写入其中一个缓冲区。 缓冲区包含渲染器绘制每个精灵所需的信息。 一旦更新线程完成更新其缓冲区并且渲染器已完成绘制,它们就交换缓冲区并重复该过程。 在游戏更新线程的代码中(渲染线程中的类似代码): currBuffer.write(); player.draw(currBuffer.getNext()); ball.draw(currBuffer.getNext()); if (particleEffect != null) { particleEffect.draw(currBuffer); } currBuffer.finished(); while(otherBuffer.isFinished() == […]

当Activity返回前台时,AlertDialog是不可见的

我写了一个程序支持下载文件。 在此下载活动中,我启动进度条,然后运行一个线程来执行下载操作。 此线程向UI线程发送消息,以通知已经频繁下载的数量。 在主(UI)线程中,我在接收消息时更新进度条显示。 如果下载进度中出现任何问题,它将发送另一条消息。 当主线程收到消息时,它会停止进度条并popup一个新的AlertDialog以显示错误原因。 这是一个特殊的测试。 下载时,将程序切换到设置。 关闭WIFI / GPRS以关闭网络。 当我回到我的程序时,它应该显示背景ui和popupAlertDialog以显示我想要的原因。 但它只显示背景ui(这意味着主要活动)和背光的半光,就像popup窗口仍在那里一样。 当我第一次按回来时,没有任何反应,除了背光很明亮,就像我关闭了一个popup窗口一样。 我想也许是因为当我启动AlertDialog时,我的活动不在前台。 我试过用: ActivityManager am = (ActivityManager)Update.this.getSystemService(Context.ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 判断最高活动是否是我的。 但我想展示对话框。 如果用户没有看到活动,当他回到我的活动时,我希望它显示对话框。

基于接收广播意图启动网络通信的正确方法是什么?

我开始使用谷歌的C2DM了。 此过程的一部分涉及在注册发生时接收广播意图。 在Google的官方C2DM文档中 ,示例代码在BrodcastReceiver的onReceive()方法中显示以下注释: // Send the registration ID to the 3rd party site that is sending the messages. // This should be done in a separate thread. 但是,我读过的所有内容,包括BroadcastReceiver的文档 ,都表明从onReceive()启动一个线程几乎肯定会导致问题,因为只要onReceive()返回,该过程很可能很快被杀死。 有人可能犯了一个错误,我应该忽略关于使用单独线程的评论,但我猜他们说这是有原因的,即使它有误导性。 有没有理由在返回之前不能或不应该使用与onReceive()相同的线程中的网络? 如果这样做有问题,即使在C2DM之外,处理必须是常见情况的正确方法是什么? 开始服务?

不断监控Android中的传感器

我试图找出监测加速计传感器的最佳方法,轮询速率小于0.25毫秒。 我已经为用户实现了一个UI选项,可以切换到恒定的监控状态,并清除电池耗尽的后果。 由于Android处理清理内存和线程的方式,远程服务是否是守护程序线程的最佳方式? 关键是要使加速度计尽可能接近监控,电池耗尽。 这种监控需要长时间运行,甚至可能超过24小时,我再次意识到功耗的后果。 任何建议的阅读或代码片段将不胜感激。 只是一个寻求Android社区智慧建议的新人。 提前致谢, 史蒂夫 澄清:我试图检测加速度发生变化的瞬间。 我的代码通过轴进行区分,但从加速度计获取实时数据是我的目标。

multithreading访问和线程的可变缓存

如果我读完一篇关于multithreading的完整章节/书,我就能find答案,但我想要一个更快的答案。 (我知道这个 stackoverflow问题类似,但还不够。) 假设有这个类: public class TestClass { private int someValue; public int getSomeValue() { return someValue; } public void setSomeValue(int value) { someValue = value; } } 有两个线程(A和B)访问此类的实例。 请考虑以下顺序: 答:getSomeValue() B:setSomeValue() 答:getSomeValue() 如果我是对的,someValue必须是volatile,否则第3步可能不会返回最新值(因为A可能有缓存值)。 它是否正确? 第二种情况: B:setSomeValue() 答:getSomeValue() 在这种情况下,A将始终获得正确的值,因为这是它的第一次访问,因此他还没有缓存值。 这是正确的吗? 如果只以第二种方式访问​​类,则不需要volatile / synchronization,或者是它? 请注意,此示例已简化,实际上我想知道复杂类中的特定成员variables和方法,而不是整个类(即哪些variables应该是volatile或具有同步访问权限)。 重点是:如果更multithreading访问某些数据,是否需要通过所有方式进行同步访问,还是取决于它们访问它的方式(例如顺序)? 阅读完评论后,我尝试用另一个例子来说明我的困惑的来源: 来自UI线程: threadA.start() threadA调用getSomeValue() ,并通知UI线程 UI线程获取消息(在其消息队列中),因此它调用: threadB.start() threadB调用setSomeValue() ,并通知UI线程 UI线程获取消息,并通知threadA(以某种方式,例如消息队列) […]

在Java中运行run()方法后,线程是否会自动收集垃圾?

线程是否自动删除并在运行后收集垃圾,或者它是否继续存在并且即使在run()方法完成后也会占用内存? 例如: Class A{ public void somemethod() { while(true) new ThreadClass().start(); } public class ThreadClass extends Thread{ public ThreadClass() {} @Override public void run() {……} } } 我想澄清一下这个线程是否会自动从内存中删除,还是需要明确地完成。

提高OpenCV性能Android – 快速对象跟踪

我正在尝试在Android上实现快速对象跟踪应用 我的逻辑如下 除去所需的颜色范围以外的所有颜色。 使用GaussianBlur平滑图像 使用HoughCircles查找最大半径圆 该应用程序的工作正常,但性能不好,我想要加快我的性能至少快5倍。 我借用了这个链接的大部分逻辑。 快速对象跟踪示例 public void apply(Mat src, Mat dst) { Mat mIntermediateMat = new Mat(src.rows(), src.cols(), CvType.CV_8UC1); Mat mHsv = new Mat(src.size(), CvType.CV_8UC3); Mat mHsv2 = new Mat(src.size(), CvType.CV_8UC3); Imgproc.cvtColor(src, mHsv, Imgproc.COLOR_RGB2HSV, 3); Core.inRange(mHsv, new Scalar(0, 86, 72), new Scalar(39, 255, 255), mHsv); // red Core.inRange(mHsv, new Scalar(150, 125, 100), […]

Android,创建一个简单的线程,将更新我的秒计数器

基本上,我试图运行一个秒计数器和一个水平计数器。 每10秒我想要++级别。 但是那还没有实现,到目前为止我只是试图让秒显示但是我得到运行时exception和崩溃。 谷歌搜索我看到它,因为我试图从我的线程更新UI,这是不允许的。 所以我想我将需要asyncTask,但我不知道如何用我简单的小程序做到这一点。 请帮忙或给我一些替代方案…… package com.ryan1; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class main extends Activity { int level = 1; int seconds_running=0; TextView the_seconds; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); the_seconds = (TextView) findViewById(R.id.textview_seconds); Thread thread1 = new Thread(){ public void run(){ try { sleep(1000); Log.d(“RYAN”, ” […]

从其他线程访问视图(Android)

我正在开发一个Android应用程序,我有一个启动/暂停某些模拟过程的按钮。 在此过程运行时,我需要实时输出一些数据。 但是当我为模拟创建一个新线程时,我无法从该线程访问视图(让它成为TextView),因为它们只能从创建它们的线程访问。 另一方面,新线程是必要的,因为否则用户在模拟运行时将无法执行任何操作(例如,按某些其他按钮)。 在这种情况下,创建新服务还需要创建新线程。 我该如何解决这个问题?

在Android中线程化UI更新

我刚刚开始使用android开发和更新UI真的很烦我:/ 这就是我到目前为止所做的工作 – 包装项目。移动; import android.os.Bundle; import android.view.View; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Color; public class Move extends Activity { private float y = 0; private long now = 0; 私人浮动延迟= 75; private Paint paint = new Paint(); @覆盖 protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(new SimpleMotion(this)); paint.setColor(Color.BLACK); } 私有类SimpleMotion扩展View { public […]